今天我在C#遇到了一个奇怪的问题。我有一个ASP.NET页面,用户可以输入一定的价格,数量等。我得到价格值,将其转换为double,然后将其乘以100,然后将其转换为整数。当价格为“33.30”时,将其转换为双倍后,它仍为33.3(显然......),但在将其乘以100后,它变为3329.9999999999995,当我通过应用简单的强制转换运算符将其转换为整数时“(int) (价格* 100)“,它变成3329。
现在我不知道为什么会这样。所以我想也许你们可以帮助:)。
答案 0 :(得分:10)
这是因为doubles are stored的方式。在使用资金时应使用decimal
以避免舍入错误。
答案 1 :(得分:8)
不要施放它,使用Math.Round围绕它。最好使用decimal类型作为货币
答案 2 :(得分:5)
由于浮点舍入错误,这种情况正在发生。浮点数无法以二进制形式准确表示,因此会出现诸如您遇到的那样的舍入错误。有关详细信息,请参阅this维基百科文章。
要克服这一点,你应该四舍五入到最接近的整数 - 最好用Math.Round
来实现。
但是,在处理货币时,最好使用decimal
类型代替double
。
答案 3 :(得分:2)
如果要转换为最接近的整数,则可以使用Math.Round
方法。
默认情况下,您所做的是flooring
- 这正是您所观察到的。 (并与C一致)
答案 4 :(得分:2)
错误是因为双打以二进制形式存储。虽然每个二进制小数都有精确的十进制扩展,但大多数小数都没有精确的二进制扩展。十进制33.3具有不精确的二进制扩展。然后将该近似值乘以100,并转换为其精确的十进制扩展,即3329.9999999999995。 (实际上,由于显示截断,这可能不是确切的扩展,但它的要点是相同的。)
答案 5 :(得分:1)
计算中的浮点算术几乎总是approximation of the "Real" value