为什么python使用float提供错误的计算
好的。。。显然我做错了什么。。。我知道从c##开始,这些浮点运算有时有点困难。。。但我认为*1000应该有用。。。好吧,错了 有人能告诉我如何做得更好吗为什么python使用float提供错误的计算,python,Python,好的。。。显然我做错了什么。。。我知道从c##开始,这些浮点运算有时有点困难。。。但我认为*1000应该有用。。。好吧,错了 有人能告诉我如何做得更好吗 非常感谢浮点数的计算总是有问题的,因为它是基于数字的二进制近似值 您可以选择 你可以尝试使用 float的精度有限。因此,经过一定数量的数字(根据用户2357112为16)后,它变得不准确。如果浮点值略低于最接近的整数,则仅使用int()进行转换时会出错。最好用round()将参数包装起来: 输出: x = '16473.6' y = str(
非常感谢浮点数的计算总是有问题的,因为它是基于数字的二进制近似值 您可以选择 你可以尝试使用
float
的精度有限。因此,经过一定数量的数字(根据用户2357112为16)后,它变得不准确。如果浮点值略低于最接近的整数,则仅使用int()
进行转换时会出错。最好用round()
将参数包装起来:
输出:
x = '16473.6'
y = str(int(round(float(x) * 1000)))
print y
你应该知道浮动不是精确的。这是因为内部表示是二进制的,而不是十进制的 虚构的示例1:实际上可以表示为0.99999999。现在,如果在这个问题上调用
int()
,则得到的不是1,而是0
您可以通过执行以下操作来解决此问题:
16473600
您也可以尝试以下方法:
y = str(int(float(x) * 1000 + 0.5))
它摆脱了浮点近似。这是一个有趣的例子,说明了为什么必须小心使用浮点数,尤其是在将它们转换为
int
时
基本问题是函数int
总是向下舍入,而不是“最接近”
因此,即使:
x = '16473.6'
y = str(int(round(float(x) * 1000)))
print(y)
事实上:
>>> 16473.6
16473.6
看起来,原始浮点数的内部表示形式只正确到了前16个左右的小数点。它最初在内部存储为16473.599999998,乘以1000将初始错误放大到略低于16473600的数字。现在int
将四舍五入到16473599
@R.T.发布的参考资料阅读得很好,可以获得更详细的解释:您想打印什么?Python
float
是64位的,大约有16位有效数字。@user2357112:谢谢,我的论证有点不正确。我更新了我的答案。
x = '16473.6'
y = str(int(round(float(x) * 1000)))
print(y)
>>> 16473.6
16473.6
>>> 16473.6*1000
16473599.999999998