我正在处理作业概率列表,所以很自然地我想在程序中添加一些内容以确保列表等于' 1'。
我正在使用示例列表[0.1,0.2,0.7]。这是我的代码的一小部分
list = [0.7, 0.2, 0.1]
total = 0
for i in list:
total += i
if total != 1.0:
print 'Bad'
else:
print 'Good'
print total
问题似乎源于清单的顺序?如果我在代码中放入列表,它告诉我它不等于一个。但是,如果我切换值[0.1,0.2,0.7],突然它等于1.
任何人都能解释一下发生了什么吗?我真的很想告诉我它等于' 1'不管列表的顺序如何。
答案 0 :(得分:2)
将Decimal library
用于accurate decimal addition
,因为浮点值不是很精确。
from decimal import Decimal
list = [Decimal(70)/Decimal(100), Decimal(20)/Decimal(100), Decimal(10)/Decimal(100)]
total = 0
for i in list:
total += i
if total != 1.0:
print('Bad')
else:
print('Good')
print(total)
这是你的结果:
好
1.0
答案 1 :(得分:1)
每当您比较浮点数时,您必须保持三角形的余量。因为十进制数字可能无法准确表示您想要的确切数字
delta = 0.000001
if (total - delta) <= 1 && (total + delta) >= 1:
print 'Good!'
else:
print 'Bad!'
答案 2 :(得分:0)
这是浮点运算的问题。这个guide是一个很好的阅读,有助于勾勒出陷阱。
对于您的特定实例,我会检查结果是否在距离1
的可容许距离内答案 3 :(得分:0)
看起来您仍然希望在列表中使用浮点数并且仍然正确显示,您应该使用错误边距而不是固定数来进行测试:
target_value = 1.0
error_margin = 1E-10
if abs( total - target_value ) <= error_margin:
print('Good')
else:
print('Bad')