Python 为什么编程语言将精度限制为22/7?

Python 为什么编程语言将精度限制为22/7?,python,ruby,haskell,floating-point,erlang,Python,Ruby,Haskell,Floating Point,Erlang,我试过了 结果是一样的。为什么?之所以会出现这种情况,是因为所有语言都对非整数使用相同的数字表示:很可能精度相同。(32位“浮动”或64位“双精度”,具体取决于系统和语言的配置方式。) 浮点数是这类操作的默认选择,很大程度上是因为硬件直接支持浮点数。然而,从根本上说,没有什么能阻止语言支持其他类型的数字。这在Haskell中最容易演示,它的标准库中有有理数: Erlang $ erl 1> Pi = 22/7. 3.142857142857143 Haskell $ ghci Prel

我试过了


结果是一样的。为什么?

之所以会出现这种情况,是因为所有语言都对非整数使用相同的数字表示:很可能精度相同。(32位“浮动”或64位“双精度”,具体取决于系统和语言的配置方式。)

浮点数是这类操作的默认选择,很大程度上是因为硬件直接支持浮点数。然而,从根本上说,没有什么能阻止语言支持其他类型的数字。这在Haskell中最容易演示,它的标准库中有有理数:

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
有理数是一个分数,所以它存储为一对整数,在除法时不会丢失任何精度。同时,与普通浮点数相比,某些操作更困难,效率更低

另一种可能的表示法是,它的范围比浮点数小,但在保持该范围内的精度方面做得更好。(我这里有很多细节。)你也可以在Haskell试试这些:

λ> 22/7 :: Rational
22 % 7

为什么你会期望不同?它们都是在同一个硬件上实现的。@jornsharpe您很可能应该将此作为一个答案发布!为什么这个标签是“pi”?相关:是的,请不要将22/7用于pi。在Haskell中,只需编写
pi
,它给出
3.141592653589793
。这不仅是因为它们共享相同的表示形式,即3.1428571428571427937015414499910548335333251953125,但也因为它们使用相同的方式打印最短的十进制表示法,可以正确地四舍五入到相同的浮点。
λ> import Data.Fixed
λ> 22/7 :: Deci
3.1
λ> 22/7 :: Centi
3.14
λ> 22/7 :: Micro
3.142857