为什么python使用float提供错误的计算

为什么python使用float提供错误的计算,python,Python,好的。。。显然我做错了什么。。。我知道从c##开始,这些浮点运算有时有点困难。。。但我认为*1000应该有用。。。好吧,错了 有人能告诉我如何做得更好吗 非常感谢浮点数的计算总是有问题的,因为它是基于数字的二进制近似值 您可以选择 你可以尝试使用 float的精度有限。因此,经过一定数量的数字(根据用户2357112为16)后,它变得不准确。如果浮点值略低于最接近的整数,则仅使用int()进行转换时会出错。最好用round()将参数包装起来: 输出: x = '16473.6' y = str(

好的。。。显然我做错了什么。。。我知道从c##开始,这些浮点运算有时有点困难。。。但我认为*1000应该有用。。。好吧,错了

有人能告诉我如何做得更好吗


非常感谢

浮点数的计算总是有问题的,因为它是基于数字的二进制近似值

您可以选择

你可以尝试使用


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