【问题标题】:Double floating point Subtraction双浮点减法
【发布时间】:2013-11-18 06:33:19
【问题描述】:

所以,这里有一个重复的问题:

在我客户的一台机器上,我有这段代码,

        public double getFreeSpace()
        {
            return this.totalSize - this.listElements.Sum();
        }

当这样的减法发生时:(1.0 - 0.8) 预期的结果是(0.2),但她得到的结果是0.199999

虽然这不是预期的结果,但如何获取 0.2 作为此代码的输出?

stackoverflow 问题here 讨论了相同的问题,但建议使用decimal 作为替代方案。 (但是,还要注意,在同一个答案中,我们会收到警告:It is a 128 bit datatype as opposed to 64 bit which is the size of a double)。

我也试过了,Math.Round(1.0-0.8, 0, MidpointRounding.AwayFromZero) 但这不起作用。

现在的问题是,如何在保持 datatype as double 相同的同时获得所需的答案 0.2 without using a decimal

【问题讨论】:

  • 如果不使用小数,就无法准确表示 0.2。不过,您可以更改之后的显示方式。您打算如何处理输出?
  • 问:现在的问题是,如何在保持与 double 相同的数据类型的同时获得所需的答案为 0.2?答:了解浮点数的工作原理:effbot.org/pyfaq/…
  • -1:非常不清楚您从链接的问题中没有理解什么。它清楚地表明“......它也不允许精确表示数字 0.2......”,并带有大量带有解释/深入技术细节的链接。如果你把你不明白的东西表现出来,这个问题可能没问题。
  • 从一开始就试图过度优化被称为“过早优化”,实际上这是一个非常糟糕的主意。它导致难以维护的过于复杂的代码令人困惑。代码清晰和简单,性能配置文件,只优化慢位。任何在 6 个月内查看您的代码的人都会感谢您(包括您自己!)。
  • @Baldrick:选择适合所需计算的数据类型和算法并不是过早的优化。

标签: c# .net floating-point double


【解决方案1】:

如果问题是

如何在保持不变的同时获得所需的答案为 0.2 数据类型为双精度,不使用小数

那么答案是:你不能

我认为您应该查看here 以获取更多信息。

对准确性的需求是创建decimal 类型的原因。这些类型的使用速度较慢,但​​更准确。

【讨论】:

  • " 这一切都源于 1 个字节是 8 位这一事实" -er,不,它没有!这是由于在给定基础中的代表性。
  • “你不能”的答案是正确的。关于为什么的推理是完全错误的。
  • @MitchWheat Point 被采取了,我已经改变了答案,但是......不是使用所说的每字节 8 位的结果吗?
  • @Shaamaan No. Floats 以二进制格式存储,或以 2 为基数以提高效率。 Decimals 以十进制格式存储,或以 10 为底,以实现十进制精度。这些都与字节中的位数无关。
  • decimal 并不比二进制浮点更准确。它只是有不同的错误。这些包括除以大多数数字(将年利率转换为月率、转换货币、计算三合一交易的单价等)和计算科学函数(正弦、对数等)时的错误。 每个数值算术系统都有错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 2012-01-30
  • 1970-01-01
  • 2016-05-02
相关资源
最近更新 更多