2017-02-16 20 views
0

ПочемуC# поплавок проблемы. Почему 1000000 + 0.10f = 1000000?

Console.WriteLine((1000000f + 0.10f).ToString("N2"));

печати

1 000 000,00

, но не 1 000 000,10?

Когда я использую тип «double» или типа «float» менее 1000000 - эта проблема исчезает!

+1

Вы находитесь рядом с пределом точности 'float' (или' Single'). Попробуйте использовать '.ToString (" G9 ")', и вы получите '' 1000000.13 "'. Вы можете положиться на первые семь (редко шесть) десятичных цифр «float», только. –

ответ

4

Используйте десятичное значение, чтобы избежать проблем с точностью и округлением.

Console.WriteLine((1000000m + 0.10m).ToString("N2")); 

Причина: поплавок имеет только точность 7 цифр (reference) - ваш номер имеет 8

+0

Fun: Есть несколько доменов, в которых предположение Microsoft о том, что вы можете положиться на 7 цифр с 'float', терпит неудачу. Например, попробуйте использовать '0.000986f.ToString()' и '0.000987f.ToString()'. Они дадут '' 0.0009860001 "и' "0.0009869999" 'соответственно. Помните, что я использую перегрузку без параметра 'ToString()'; требуя более 7 цифр с '.ToString (« R »)' или '.ToString (« G9 ») - это другое дело (где вы просите увидеть неточность самостоятельно). –

1

Согласно MSDN типа поплавок имеет только 7 точность цифр. Один миллион имеет 7 цифр, десятичная часть округлена.

Двойной тип имеет точность от 15 до 16 цифр, поэтому milion может содержать десятичную часть длиной 8-9 цифр. Число меньше одного миллиона имеет менее 7 цифр (без десятичной части).