Python 浮点随机(?!)精度怪癖

Python 浮点随机(?!)精度怪癖,python,Python,我刚刚开始学习python,我偶然发现了一个特殊性 python版本: Python 2.7.2(默认值,2011年7月20日,02:32:18)[GCC 4.2.1(LLVM, linux2上的Emscripten 1.5,Empythones)] 关于: 与口译员合作分配: pi = 3.141 // 3 places decimal precision #typing pi & pressing return puts 3.141 type(pi) =>

我刚刚开始学习python,我偶然发现了一个特殊性

python版本:

Python 2.7.2(默认值,2011年7月20日,02:32:18)[GCC 4.2.1(LLVM, linux2上的Emscripten 1.5,Empythones)]

关于:

与口译员合作分配:

    pi = 3.141 // 3 places decimal precision
    #typing pi  & pressing return puts 3.141
   type(pi)
=> <type 'float'>
    pi = 3.1415
   type(pi)
=> <type 'float'>
    #pi puts 3.1415000000000002

整数和浮点被赋予一定数量的位。对于整数,每一位对应于二的幂。第一个数字是20,然后是21、22,依此类推。因此,为了存储整数
5
,我们有20+22=1+4

对于浮点数,我们将其存储为两部分。指数和小数。如果我们的小数点为.75,指数为2,那么我们就得到.75*102=7.5。小数存储为2的负幂。所以我们有2-1,2-2。2-3. 等。这些等同于
.5
.25
.125

有些数字无法存储,因为它们实际上需要无限位来表示,如0.1,而其他如3.1415需要的位比CPU为浮点数提供的位更多(24是32位浮点的标准,但算法不同)

比较浮动的正确方法是定义一个方差,并沿着这些线使用一些东西

variance = .0001
floatsEqual = lambda f1, f2: f1 - variance <= f2 and f1 + variance >= f2

if (floatsEqual(3.1415, 3.1415 + 1 - 1)):
    pass
方差=.0001
floatsEqual=λf1,f2:f1-方差=f2
如果(floatsEqual(3.1415,3.1415+1-1)):
通过

在Python中,十进制库也很有用。

不是每个十进制分数都可以用二进制编码的浮点精确表示。因此,将
==
与浮动一起使用通常不是一个好主意。一个更简单的情况:
0.1+0.2
的计算结果为
0.3000000000004
。这不是精度损失,这是以二进制IEEE-754格式编码十进制分数的副产品。@android为什么它会减少我的精确赋值?如果您想要精度,可以使用
decimal
模块。@raam86。可能会有帮助。@raam86如果您仍然感到困惑,请阅读如何将小数从十进制转换为二进制,并尝试手动(在纸上)为
0.1
进行此转换。你会明白原因的。
variance = .0001
floatsEqual = lambda f1, f2: f1 - variance <= f2 and f1 + variance >= f2

if (floatsEqual(3.1415, 3.1415 + 1 - 1)):
    pass