Как в сишарпе округлить число типа флоат*?

Kitry

надо округлить до ссотых
щас вот такой вот код

но как видите не работает
подумываю преобразовать число в строку , отрезать лишее и обратно
может есть более правильный путь?

oliver11

Капитан хочет заметить, что число 229.66 в типе float не представимо.

Kitry

как это? там же до 7 знаков точность?

oliver11

RTFM IEEE 754
Надо отдать должное Microsoft: в MSDN он даже вскользь упомянут.

Kitry

RTFM IEEE 754
в кратце можно, что там пишут? уже два часа вожусь с этой ошибкой
тип double тоже такой же хуёвый?

Kitry

Надо отдать должное Microsoft: в MSDN он даже вскользь упомянут.
ну и кстати, интересно, стандарты, которые даже в МСДН упомянуты лишь вскольз, капитан очевидность конечно знает на зубок? ;)
может он и теорему кронекера капелли в голове держит...

fufa58

потомушто это блеать базовое знание о флоатах

IG_rok777

Читай что такое числа с плавающей точкой. Тебе decimal тогда нужен.
http://msdn.microsoft.com/en-us/library/364x0z75%28v=vs.80%2...

Dasar

Число 229.66 во float-е представляется как 229.660004, о чем debugger и сообщает.
Функции которые преобразуют флоат в строку знают об этой особенности, и учитывают ее. Когда число 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

Kitry

потомушто это блеать базовое знание о флоатах
хочешь сказать, об этом в Керниган Ричи написано?
убей не помню такого факта

Kitry

Когда число 229.660004 преобразуется в строку оно выводится как 229.66
не понял? если я напишу var x = 229.660004F; а потом преобразую x в строку , то получу '229.66' ?

Kitry

не понял? если я напишу var x = 229.660004F; а потом преобразую x в строку , то получу '229.66' ?
пардон, не заметил , что ответ есть в дарк греевском посте
только я не понял, почему обрежутся знаки до сотых ? я ж положил константу, которая мне нужна и она представима во флоате

Kitry

229.660004F
Мне тут подсказали в наушник, что 229.660004F тоже не представимо во флоате
но почему тогда студия мне вывела такую хуету как в первом посте?

apl13

как это? там же до 7 знаков точность?
Ну да.
229.660004
123 4567

Что тебя приводит в недоумение?

Dasar

Мне тут подсказали в наушник, что 229.660004F тоже не представимо во флоате
но почему тогда студия мне вывела такую хуету как в первом посте?
потому что ближайшее представимое число 229,660003662109, такие числа редко кто хочет видеть, поэтому хвост, который формируется последним битом float-а отбрасывается. При отбрасывании используются разные алгоритмы: при преобразование в строку делается вид, который больше нравится людям, в debugger-е используется вывод более точный

bleyman

А вот интересно, стандарт C# гарантирует что преобразование в строку после округления до сотых всегда успешно отбросит ошибку округления? И всегда ли это возможно гарантировать (если, разумеется, требовать round tripping)?
ОПу: если ты хочешь округлить до сотых чтобы потом распечатать, пиши x.ToString("0.00")

Dasar

А вот интересно, стандарт C# гарантирует что преобразование в строку после округления до сотых всегда успешно отбросит ошибку округления? И всегда ли это возможно гарантировать (если, разумеется, требовать round tripping)?
Если сотые входят в точные цифры (перед запятой меньше 6 цифр для float то гарантия есть. Если не входят, то гарантии нет.
Оставить комментарий
Имя или ник:
Комментарий: