我试过
Erlang
$ erl
1> Pi = 22/7.
3.142857142857143
Haskell
$ ghci
Prelude> 22/7
3.142857142857143
Python
$ python
>>> 22/7.0
3.142857142857143
Ruby
$ irb
2.1.6 :001 > 22 / 7.0
=> 3.142857142857143
结果是一样的。为什么呢?
答案 0 :(得分:16)
这是因为所有语言对非整数使用相同的数字表示:IEEE 754 floating point numbers,很可能是相同的精度级别。 (32位“浮点数”或64位“双打”,具体取决于系统和语言的配置方式。)
浮点数是此类操作的默认选择,很大程度上是因为它们直接支持硬件。然而,从根本上说,没有什么能阻止语言支持其他类型的数字。这在Haskell中最容易演示,Haskell在其标准库中具有有理数:
λ> 22/7 :: Rational
22 % 7
有理数是一个分数,因此它存储为一对整数,并且在分割时不会失去任何精度。与此同时,某些操作比使用普通浮点数更困难,效率更低。
另一种可能的表示是fixed-point numbers,其范围小于浮点数,但在范围内保持精度的效果更好。 (我在这里真的很多细节。)你也可以在Haskell中尝试这些:
λ> import Data.Fixed
λ> 22/7 :: Deci
3.1
λ> 22/7 :: Centi
3.14
λ> 22/7 :: Micro
3.142857