2010-09-20 8 views
3

Вдохновленный this question следующее не делать то, что я бы ожидать, что это:Почему числа с плавающей запятой точно представлены в C#?

float myFloat = 0.6; 
Console.WriteLine(myFloat); 
// Output: 0.6 

Я бы ожидать, что выше, чтобы распечатать 0.60000002384185791 (точка представление плавающего 0.6) - очевидно, есть некоторые механизм, который делает эту работу, когда на самом деле она не должна (хотя, как видно из связанного вопроса, она иногда не работает)

Что это за механизм и как он работает?

+0

@NullUserExceptiuon - правда, я буду изменять заголовок. – Justin

+0

Выход по умолчанию для поплавка - 7 значащих цифр. 0.6000000, а затем конечные нули удаляются – adrianm

ответ

4

Если посмотреть на реализацию Console.WriteLine, вы увидите, что он заканчивается вызовом ToString на значение по умолчанию FormatProvider. То есть результат, который вы видите, - это количество, которое отображается при форматировании с помощью этого поставщика форматов.

Пока он не объясняет детали того, как создается результат, он показывает, что Console.WriteLine проходит через некоторое форматирование значения перед его печатью.

3

Я предположил бы, перегрузка WriteLine, которая принимает поплавок делает округления при преобразовании его в строку ...

+0

Если вы не хотите округлять его, используйте что-то вроде этого: Console.WriteLine (m.ToString («F8», CultureInfo.InvariantCulture)); где F представляет собой неподвижную точку Для получения дополнительной информации см http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx#FFormatString –

1

0,6 не могут быть представлены под поплавками IEEE754. Он находится между 0,599999964237213134765625 (0x3f199999) и 0,600000083446502685546875 (0x3f19999b). В режиме от округления до ближайшей версии 0.60000002384185791015625 (0x3f19999a) это то, что печатает WriteLine.

Вы должны либо использовать представление с плавающей точкой выше точности (двойной) или ограничить число знаков после запятой в WriteLine принты:

float f = 0.6; Console.WriteLine("{0:N6}", f); 
+0

ОП знает флоат неточностью, и задается вопросом, почему выход ** это ** 0,6 :) – snemarch

Смежные вопросы