Python没有正确处理小数字

时间:2016-04-11 00:51:23

标签: python numbers decimal pycharm

我正在尝试创建一个python脚本但是无法让它正常工作。我正在处理非常小的数字,python似乎不喜欢它。这是我的剧本:

x = 0
while x < 3:
    x += .0001
    if x == 2.5:
        print "X is now: ", x
        break
    else:
        print x

当我在PyCharm中运行它时,我得到了这个输出(我缩短了它,所以你不必滚动一堆数字。)

2.4988
2.4989
2.499
2.4991
2.4992
2.4993
2.4994
2.4995
2.4996
2.4997
2.4998
2.4999
2.5
2.5001
2.5002
2.5003
2.5004
2.5005
2.5006
2.5007
2.5008
2.5009
2.501

Pycharm就像我的“if”语句不存在一样。它跳过数字2.5而不运行

if x == 2.5:
    print "X is now: ", x
    break

我认为这与我的电脑运行这些数字的方式有关,我看到的2.5真的是2.5000001,但我不知道。我已经尝试将这些数字放入科学记数法中,希望它有所帮助,但我得到的错误是“处理输出太多”

我对python很新,我开始对此感到恼火。任何和所有帮助它赞赏。感谢。

2 个答案:

答案 0 :(得分:1)

在处理浮点数学时,通常最好有一些epsilon值来比较数据以进行阈值比较。例如

if abs( x - 2.5 ) < 0.001
    print  "X is now ", x
    break;

答案 1 :(得分:0)

罪魁祸首是浮点数学。

  

浮点数学:

     

您的语言没有被破坏,它正在进行浮点数学运算。计算机只能本机存储整数,因此它们需要一些表示十进制数的方法。这种表示有一定程度的不准确性。这就是为什么,通常是.1 + .2!=。3。   为什么会这样?

     

实际上非常简单。当你有一个基础10系统(像我们的)时,它只能表示使用基数的素数因子的分数。 10的素因子是2和5.所以1 / 2,1 / 4,1 / 5,1 / 8和1/10都可以干净地表达,因为分母都使用10的素因子。相比之下,1 / 3,1 / 6和1/7都是重复小数,因为它们的分母使用素数因子3或7.在二进制(或基数2)中,唯一的素数因子是2.所以你只能干净地表示分数仅包含2作为主要因素。在二进制中,1 / 2,1 / 4,1 / 8都将以小数形式干净地表示。而1/​​5或1/10将重复小数。因此,在基本10系统中,0.1和0.2(1/10和1/5),而干净的小数位,是计算机运行的基本2系统中的重复小数。当您对这些重复小数进行数学运算时,您最终得到剩余的小数当您将计算机的基本2(二进制)数转换为更易读的基数10时,它会继续存在。

来源:http://0.30000000000000004.com/