【问题标题】:Dividing by 100 precision除以 100 精度
【发布时间】:2012-05-04 15:04:35
【问题描述】:

我正在做某事,但遇到了一个我不明白的问题。

double d = 95.24 / (double)100;
Console.Write(d); //Break point here

控制台输出为 0.9524(如预期),但如果我在停止程序后查看“d”,它会返回 0.95239999999999991。

我已经尝试了所有可能的演员,结果是一样的。问题是我在其他地方使用了“d”,这个精度问题使我的程序失败了。

那么它为什么要这样做呢?我该如何解决?

【问题讨论】:

  • 在 SO 上有很多像这样的浮点数问题
  • 猜测 Double.ToString 的默认格式仅显示 4 位小数。如果你想要一个精确的表示,你应该移动到十进制类型(浮点数和双精度不是精确的表示)

标签: c# double precision divide


【解决方案1】:

使用decimal 而不是双精度。

【讨论】:

    【解决方案2】:

    http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

    它的缺点是浮点数以相当于以 2 为底的科学记数法存储。有一个整数有效位被理解为在小数点前有一位,它被提高到 2 的整数幂。这允许以相对紧凑的格式存储数字;缺点是从以 10 为基数到以 2 为基数的转换会引入错误。

    为了缓解这种情况,只要需要低幅度的高精度,请使用decimal 而不是double; decimal 是一种 128 位浮点数类型,旨在具有非常高的精度,但以缩小范围为代价(它只能表示高达 +- 79 nonillion、7.9E28 的数字,而不是 double 的 +- 1.8E308;对于大多数非天文、非物理的计算机程序)和双倍的内存占用量。

    【讨论】:

      【解决方案3】:

      一篇很好的文章,描述了很多:What Every Computer Scientist Should Know About Floating-Point Arithmetic它与C#无关,但与一般的浮点运算有关。

      【讨论】:

        【解决方案4】:

        您可以改用decimal

        decimal d = 95.24 / 100m;
        Console.Write(d); //Break point here
        

        【讨论】:

          【解决方案5】:

          试试:

          double d = Math.Round(95.24/(double)100, 4);
          
          Console.Write(d);
          

          编辑:或者使用小数,是的。我只是想让答案尽可能与问题相似:)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多