2010-03-27 41 views
2

今天我在C#中遇到了一个奇怪的问题。我有一个ASP.NET页面,用户可以在其中输入特定的价格,数量等。我得到价格值,将其转换为double,然后将其乘以100,然后将其转换为整数。当价格是“33.30”,在将其转换为双倍之后,它仍然是33.3(显然是......),但是在与100相乘之后,它变成3329.9999999999995,并且当我通过应用简单的投射运算符“(int) (价格* 100)“,它变成3329.C#:数字转换问题

现在我不知道为什么会发生这种情况。所以我想可能你们可以帮忙:)。

回答

10

这是因为doubles are stored的方式。使用金钱处理时,您应该使用decimal以避免舍入错误。

+1

+1精确地:-) – Steffen

2

如果要将其转换为最接近的整数,则此方法有Math.Round方法。

您在默认情况下所做的是flooring - 这正是您所观察到的。 (并与C一致)

+0

但我想知道为什么33.3乘以100产生3329.9999999999995。任何想法 ?关于这个问题,我已经使用“Convert”类的方法解决了它:) –

5

这是由于浮点舍入错误而发生的。浮点数不能用二进制精确表示,因此舍入错误(例如发生的错误)会发生。有关更多详细信息,请参见this维基百科文章。

为了克服这个问题,你应该舍入到最接近的整数 - 这最好通过使用Math.Round来实现。

但是在处理货币时,最好使用decimal而不是double

2

这个错误是因为双打都以二进制形式存储。尽管每个二进制小数具有精确的十进制扩展,但大多数小数不具有精确的二进制扩展。十进制33.3有一个不精确的二进制扩展。这个近似值然后乘以100,并转换成精确的十进制扩展,即3329.9999999999995。 (其实,这可能不是确切的扩展,由于显示截断,但它的要点是相同的。)