haskell - 丑陋的 double - 为什么是 2.9000000000000004 而不是 2.9?

标签 haskell

这个问题在这里已经有了答案:





Is floating point math broken?

(31 个回答)


8年前关闭。




当我在 ghci 中执行 5.2 - 2.3 时,我将得到 2.9000000000000004 而不是 2.9。
当使用 Double 或 Float 时,这种丑陋的(并且对于人类来说是错误的)结果也会出现在其他地方。

为什么会这样? (这只是出于好奇,不是我真正的问题)

我真正的问题:
我如何告诉 ghci 不要那样做,并像任何其他编程语言(和计算器)一样显示 double 运算的结果,就像每个 15 岁的 child 都会写它们一样?

当我使用 ghci 作为一个不错的计算器并处理我执行此类操作的列表时,这真是太烦人了。

map ((-)2.3) [4.0, 3.8, 5.2, 6.4, 1.3, 8.3, 13.7, 9.0, 7.5, 2.4]
[-1.7000000000000002,-1.5,-2.9000000000000004,-4.1000000000000005,0.9999999999999998,-6.000000000000001,-11.399999999999999,-6.7,-5.2,-0.10000000000000009]

之后在一张纸上使用数字时,这无济于事

提前致谢 :)

最佳答案

Why does this happen?



因为某些浮点数不能在不四舍五入的情况下用有限的位数表示。 Floating-point numbers位数有限,它们不能代表所有 real numbers准确:当数字多于格式允许的数字时,将省略剩余的数字 - 数字被四舍五入。

您可能应该阅读 What Every Computer Scientist Should Know About Floating-Point Arithmeticthis answer .

关于haskell - 丑陋的 double - 为什么是 2.9000000000000004 而不是 2.9?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17770110/

相关文章:

haskell - 如何在 GHCi 中插入反引号?

haskell - 在什么情况下通用子表达式消除会影响 Haskell 程序的惰性?

arrays - 在保护条件下使用 unsafePerformIO

haskell - 在 MaybeT ( StateT ) monadT 堆栈中调用纯函数以使错误传播的惯用方法是什么?

haskell - 使用 Aeson 解析带有嵌套列表的列表

algorithm - haskell NB : ‘Edge’ is a non-injective type family

haskell - Haskell中一元运算符的前缀形式

haskell - 为什么 Haskell 有非严格函数(语义)?

haskell - 我可以抽象地导入非抽象类型吗?