Вопрос

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.

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

Это было полезно?

Решение

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

1.05
4.93 +
------
5.98

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

И ссылка на Википедию, на всякий случай: http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems ;)

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top