一个循环被告知增加0.1,它返回的值是0.300000000000000004

2024-04-24 20:12:54 发布

您现在位置:Python中文网/ 问答频道 /正文

基本上我认为我创建了一个循环,每次迭代只增加.1。我得到的是下面的数字,比如0.300000000000000004,0.79999999999999,3.0000000000000013。这是我的代码和结果。为什么不是。1,。2。3等等,和/或为什么是0.3000000000000004,0.4,0.5,0.6,0.7,0.79999999999等等,基本上为什么它们是出乎意料的,对我来说,小数。你知道吗

>>> tph_bin = []
>>> bin_num = 0
>>> while bin_num <= 3.5:
    tph_bin.append(bin_num)
    bin_num = bin_num + .1


>>> tph_bin
[0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, 0.8999999999999999, 0.9999999999999999, 1.0999999999999999, 1.2, 1.3, 1.4000000000000001, 1.5000000000000002, 1.6000000000000003, 1.7000000000000004, 1.8000000000000005, 1.9000000000000006, 2.0000000000000004, 2.1000000000000005, 2.2000000000000006, 2.3000000000000007, 2.400000000000001, 2.500000000000001, 2.600000000000001, 2.700000000000001, 2.800000000000001, 2.9000000000000012, 3.0000000000000013, 3.1000000000000014, 3.2000000000000015, 3.3000000000000016, 3.4000000000000017]

额外的问题:有没有更好的方法来创建一个以.1递增的数字列表?你知道吗


Tags: 方法代码列表bin数字num小数append
3条回答

这基本上就是使用浮点数的缺点。数字0.2加0.1刚刚溢出,结果无法放入为float类型保留的内存块中,因此它会剪切溢出的部分并围绕该值进行舍入。如果你想用这种方法处理数字,你应该用整数运算,然后把结果除以10或者只是把值四舍五入,但是千万不要尝试用值来比较浮点值,因为结果可能会令人惊讶。你知道吗

奖励问题的答案:有没有更好的方法来创建一个以.1递增的数字列表?你知道吗

和numpy在一起

numpy.arange(0,3.5,0.1)

这是浮点精度限制。请参考:

https://docs.python.org/2/tutorial/floatingpoint.html

0.1实际上存储为二进制分数:

0.00011001100110011001100110011001100110011001100110011010

如您所见,这可能会导致在添加数字时出现二进制舍入错误。你知道吗

如果您只关心小数点后1位的精度,请尝试使用十进制:

from decimal import *
value = Decimal("0.1")+Decimal("0.1")+Decimal("0.1")
print value
# 0.3
if Decimal('0.3') == value
  print 'This works!'

相关问题 更多 >