我正在使用python并使用乘法和除法进行游戏但我无法通过此操作获得所需的准确度。以下示例可能有助于达到我的目的。
让a = 3
和b = 4
,他们的欧几里德范数(sqrt(a*a + b*b))
为5.0,并且除法工作正常,例如3/5.0
为0.6,4/5.0
= 0.8。但是当我想要做出以下3 * -0.8 + 0.6*4
时,答案是一个小数字但不是预期的零。
我知道数据类型,寄存器和一般机器限制所固有的问题,但我认为必须有一种方法,至少可以进行简单的计算(如示例)而没有错误。
答案 0 :(得分:3)
您可以使用Fraction
获得准确答案:
>>> from fractions import Fraction
>>> Fraction(-8, 10) * 3 + Fraction(6, 10) * 4
Fraction(0, 1)
或使用Decimal
:
>>> from decimal import Decimal
>>> Decimal('-0.8') * 3 + Decimal('0.6') * 4
Decimal('0.0')
小心小数点中使用的String
:使用正常数字会使小数点使用数字的不准确值。
答案 1 :(得分:1)
这应该特别为Python提供一些见解:http://docs.python.org/2/tutorial/floatingpoint.html
但是,处理器执行的浮点计算的情况相同。由于如何存储浮点数,因此无法准确表示所有数字的整个连续体。当您执行操作时,数字末尾的一些额外“近似”数据(通常在输出中看不到(它被剪掉))会进入您的计算。请注意,3。* - 8./10.+0.6 * 4可以更接近您的预期,可能是因为3. * 8和10的近似值比0.8更接近实际值,所以你结束了积累的错误较少。
Python有一个可以使用的十进制库,它使用不同的底层表示,但除非你只做一些操作,否则它会变慢。如果获得“精确”数字更重要,那么使用其中一个库,否则浮点近似通常就足够了。您可以在此处找到更多信息:http://docs.python.org/2/tutorial/floatingpoint.html