2010-11-25 4 views
0

Можно создать дубликат:
Why is floating point arithmetic in C# imprecise?Почему 0,1 * 10-1 не равно 0?

Console.WriteLine(0.5f * 2f);  // 1 
Console.WriteLine(0.5f * 2f - 1f); // 0 

Console.WriteLine(0.1f * 10f);  // 1 
Console.WriteLine(0.1f * 10f - 1f); // 1.490116E-08 

0.1f * 10f - 1f Почему в конечном итоге 1.490116E-08 (0.0000001490116)?

+5

См: [ "Почему может быть не десятичных чисел (http://stackoverflow.com/questions/1089018/why-cant-decimal-numbers-be-represented-exactly-in-binary) – 2010-11-25 00:41:07

ответ

4

См. Wiki: Floating Point. float/double/decimal: относительная точность. Не все значения (которых бесконечно много) могут быть точно сохранены. Вы видите результат этой потери точности. Вот почему почти всегда правильно использовать |a - b| < small_delta для сравнения с плавающей точкой.

0

Простые, аппроксимации накапливаются.

1

Поскольку операций с плавающей запятой не являются точными, посмотрите здесь:

раздел Some other computer representations for non-integral numbers. 0,1 не может быть окончательно изображен в основании 2.

0

0,5 представлен точно в плавающей точке, поэтому 0.5 * 2 = 1 точно.

Однако 0,1 не представима точно, следовательно, 0,1 * 10 не совсем 1.

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