【问题标题】:C# : Number Conversion ProblemC#:数字转换问题
【发布时间】:2010-03-27 09:46:29
【问题描述】:

今天我在 C# 中遇到了一个奇怪的问题。我有一个 ASP.NET 页面,用户可以在其中输入某些价格、数量等。我得到价格值,将其转换为双倍,然后将其乘以 100,然后将其转换为整数。当价格为“33.30”时,将其转换为双倍后仍为 33.3(显然......),但在乘以 100 后,它变为 3329.9999999999995,当我通过应用简单的强制转换运算符“(int)将其转换为整数时(price * 100) ", 变成 3329。

现在我不知道为什么会这样。所以我想也许你们可以帮忙:)。

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      不要强制转换,使用Math.Round 将其舍入。最好使用decimal 类型的货币

      【讨论】:

        【解决方案3】:

        这是由于浮点舍入错误而发生的。浮点数无法以二进制准确表示,因此会发生诸如您遇到的舍入错误。有关更多详细信息,请参阅this 维基百科文章。

        要克服这个问题,您应该四舍五入到最接近的整数 - 最好使用 Math.Round 来实现。

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

        【讨论】:

          【解决方案4】:

          如果您想转换为最接近的整数,可以使用 Math.Round 方法。

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

          【讨论】:

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

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

          【讨论】:

            【解决方案6】:

            计算中的浮点运算几乎总是approximation of the "Real" value

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-11-17
              • 1970-01-01
              • 1970-01-01
              • 2023-02-08
              • 2016-11-27
              • 2011-03-09
              相关资源
              最近更新 更多