Вопрос с добавлением плавающей запятой - PullRequest
0 голосов
/ 15 декабря 2009
float totalAmount = 0;
.
.
.//totalAmount assigned value 1.05 correctly
.
totalAmount  += float.Parse(dataRow["Amt"].ToString()); //where dataRow["Amt"] has value 4.93

Ответ, который я получаю для totalAmount, составляет 5,97999954 вместо 5,98

Почему это происходит?

Ответы [ 3 ]

9 голосов
/ 15 декабря 2009

Вы утверждаете, что totalAmount равно 1,05 до накопления. Это дало бы ожидаемые результаты:

1.05
4.93 +
------
5.98

Вы получаете 5.97999954, который в основном является ответом, лучше всего представлен с плавающей точкой IEEE, который является двоичным форматом, который не может точно выразить каждое десятичное число. Например, довольно распространенный 0.1 10 имеет бесконечное двоичное представление с плавающей запятой .0001100110011... 2 .

И ссылка на Википедию, для хорошей меры: http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems;)

1 голос
/ 15 декабря 2009

Это связано с представлением чисел base-10 в системе base-2 .

Математика с плавающей точкой на компьютерах всегда делает это. Если вы знаете требуемый уровень точности, вам следует использовать соответствующее десятичное представление.

0 голосов
/ 15 декабря 2009

jdmichal - это правильно, но я добавлю, что, если вы действительно хотите, чтобы это сложилось правильно, вы можете использовать тип Decimal (включая десятичные литералы).

...