2009-12-15 7 views
0
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

Да, почему heck * не * '4.93 + 1.05' равен' 4.98' ?? ;) –

+0

Я предполагаю, что вы имеете в виду вместо ** 5 **. 98 –

+0

Вы можете уйти от этого, если внутренний объект является поплавком. (float) dataRow ["Amt"] – ChaosPandion

ответ

9

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

1.05 
4.93 + 
------ 
5.98 

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

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

+1

+1 - Бросьте ссылку в Википедии для хорошей оценки. – ChaosPandion

+0

Готово и сделано. :) – Randolpho

+0

эта маленькая война редактирования смешно. Я перестану пытаться. – Randolpho

1

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

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

0

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

+0

Существует множество вариантов исправления, в зависимости от контекста проблемы. Например, фиксированная точность (например, валюта) позволяет разделять десятичную часть на интегральный тип. – jdmichal

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

  • Нет связанных вопросов^_^