Как в сишарпе округлить число типа флоат*?
Капитан хочет заметить, что число 229.66 в типе float не представимо.
как это? там же до 7 знаков точность?
Надо отдать должное Microsoft: в MSDN он даже вскользь упомянут.
RTFM IEEE 754в кратце можно, что там пишут? уже два часа вожусь с этой ошибкой
тип double тоже такой же хуёвый?
Надо отдать должное Microsoft: в MSDN он даже вскользь упомянут.ну и кстати, интересно, стандарты, которые даже в МСДН упомянуты лишь вскольз, капитан очевидность конечно знает на зубок?
может он и теорему кронекера капелли в голове держит...
потомушто это блеать базовое знание о флоатах
Читай что такое числа с плавающей точкой. Тебе decimal тогда нужен.
Функции которые преобразуют флоат в строку знают об этой особенности, и учитывают ее. Когда число 229.660004 преобразуется в строку оно выводится как 229.66
пример:
float x1 = 229.66f;
Console.WriteLine(x1);
Console.WriteLinedouble)x1);
float x2 = 229.660004f;
Console.WriteLine(x2);
Console.WriteLinedouble)x2);
вывод:
229,66
229,660003662109
229,66
229,660003662109
потомушто это блеать базовое знание о флоатаххочешь сказать, об этом в Керниган Ричи написано?
убей не помню такого факта
Когда число 229.660004 преобразуется в строку оно выводится как 229.66не понял? если я напишу var x = 229.660004F; а потом преобразую x в строку , то получу '229.66' ?
не понял? если я напишу var x = 229.660004F; а потом преобразую x в строку , то получу '229.66' ?пардон, не заметил , что ответ есть в дарк греевском посте
только я не понял, почему обрежутся знаки до сотых ? я ж положил константу, которая мне нужна и она представима во флоате
229.660004FМне тут подсказали в наушник, что 229.660004F тоже не представимо во флоате
но почему тогда студия мне вывела такую хуету как в первом посте?
как это? там же до 7 знаков точность?Ну да.
229.660004
123 4567
Что тебя приводит в недоумение?
Мне тут подсказали в наушник, что 229.660004F тоже не представимо во флоатепотому что ближайшее представимое число 229,660003662109, такие числа редко кто хочет видеть, поэтому хвост, который формируется последним битом float-а отбрасывается. При отбрасывании используются разные алгоритмы: при преобразование в строку делается вид, который больше нравится людям, в debugger-е используется вывод более точный
но почему тогда студия мне вывела такую хуету как в первом посте?
ОПу: если ты хочешь округлить до сотых чтобы потом распечатать, пиши x.ToString("0.00")
А вот интересно, стандарт C# гарантирует что преобразование в строку после округления до сотых всегда успешно отбросит ошибку округления? И всегда ли это возможно гарантировать (если, разумеется, требовать round tripping)?Если сотые входят в точные цифры (перед запятой меньше 6 цифр для float то гарантия есть. Если не входят, то гарантии нет.
Оставить комментарий
Kitry
надо округлить до ссотыхщас вот такой вот код
но как видите не работает
подумываю преобразовать число в строку , отрезать лишее и обратно
может есть более правильный путь?