我已经在线查看了python的浮点算术限制,似乎解决问题的最简单方法是使用十进制模块。例如,我尝试了以下代码,它给了我完美的0.8答案。
heroku
但是,当我尝试将此方法合并到涉及列表的算法时,该方法失败。
from decimal import Decimal
Decimal('4') - Decimal('3.2')
这给了我一个“InvalidOperation”错误。然后我试了
from decimal import Decimal
number = [3.2, 1.1]
Decimal('4') - Decimal('number[0]')
这个编译但给了我十进制('0.7999999999999998223643160600'而不是0.8
那么有人可以告诉我如何解决这样的问题吗? (使用十进制或任何其他方法)。
提前致谢!
答案 0 :(得分:3)
将字符串参数传递给Decimal以获得预期的行为。在您的示例中,您传递的是浮点数3.2
而不是字符串'3.2'
number = [ '3.2', '1.1' ]
Decimal('4') - Decimal(number[0])
返回:
Decimal('0.8')
答案 1 :(得分:1)
以字符串形式用'4'指定Decimal('4')
的原因是因为当Python中的Decimal
类的实例用字符串实例化时,需要“符合十进制数字字符串句法。”像'number[0]'
这样的字符串不代表数字,预计格式错误的字符串会引发InvalidOperation
例外。
像Decimal('4') - Decimal('3.8')
之类的东西不是技术浮点数,但会得到一个确切的答案。浮点比算术更复杂,通常用小数点来理解,并且不会非常精确。
在这里查看Decimal
类的文档(https://docs.python.org/3.6/library/decimal.html)以及此处有关浮点运算的文章(https://docs.python.org/3/tutorial/floatingpoint.html)可能会有所帮助。