将double值乘以100.0会引入舍入误差?

时间:2010-07-08 15:04:50

标签: c# .net math

这就是我正在做的事情,它有99.999%的时间有效:

((int)(customerBatch.Amount * 100.0)).ToString()

金额值是双倍的。我试图将价值以便士的价格写入文本文件,以便传输到服务器进行处理。金额绝不会超过2位精度。

如果您使用580.55作为金额,则此行代码将返回58054作为字符串值。

此代码在64位的Web服务器上运行。

有什么想法吗?

8 个答案:

答案 0 :(得分:21)

你应该使用十进制进行货币计算。

((int)(580.55m * 100.0m)).ToString().Dump();

答案 1 :(得分:8)

您可以使用decimal值进行准确计算。 Double是浮点数,在计算过程中不能保证精确。

答案 2 :(得分:4)

我猜测580.55正在转换为58054.99999999999999999999999999 ...,在这种情况下,int会将其四舍五入为58054.您可能想要编写自己的函数,将您的金额转换为具有某种舍入的int或者使这不会发生的门槛。

答案 3 :(得分:3)

尝试

((int)(Math.Round(customerBatch.Amount * 100.0))).ToString()

答案 4 :(得分:0)

我的建议是将值存储为便士的整数,然后选择dollars_part = pennies / 100cents_part = pennies % 100。这将完全避免舍入错误。

编辑:当我写这篇文章时,我没有看到你无法改变数字格式。最好的答案可能是使用其他人建议的圆形方法。

编辑2:正如其他人所指出的那样,最好使用某种定点十进制变量。这比我原来的解决方案更好,因为它会将有关小数点位置的信息存储在它所属的值中而不是代码中。

答案 5 :(得分:0)

由于诸如此类的舍入错误,您实际上不应该使用double值来表示货币。

相反,您可以考虑使用整数值来表示货币金额,以便准确表示它们。要表示小数,您可以使用类似的方法将580.55存储为值58055

答案 6 :(得分:0)

不,乘法不会引入舍入误差 但并非所有值都可以用浮点数表示。 x.55是其中之一)

答案 7 :(得分:0)

Decimal比double更精确。尝试小数点。

http://msdn.microsoft.com/en-us/library/364x0z75%28VS.80%29.aspx