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

时间:2014-08-21 06:53:42

标签: python

x = '16473.6'
y = str(int(float(x) * 1000))
print(y)

>>>16473599

好吧......显然我做错了什么......我知道这些浮动的东西有时候从c#有点困难......但我认为* 1000应该有用......好错了

有人可以告诉我如何做得更好吗?

非常感谢

5 个答案:

答案 0 :(得分:4)

您可能还想尝试一下:

x = '16473.6'
y = str(int(round(float(x) * 1000)))
print(y)

它摆脱了浮动近似值。

答案 1 :(得分:3)

浮点数始终存在计算问题,因为它基于数字的二进制近似值。

您可以查看 Floating Point Arithmetic: Issues and Limitations

您可以尝试使用Decimal

x = '16473.6'
y = str(int(Decimal(x) * 1000))
print(y)

答案 2 :(得分:3)

这是一个有趣的演示,说明为什么你必须小心浮点数,特别是将它们转换为int

基本问题是函数int总是向下舍入,而不是"到最近的"。

所以,即使:

>>> 16473.6
16473.6

它也是如此:

>>> 16473.6*1000
16473599.999999998

原始浮点数的内部表示似乎只对前16个左右的小数点有效。它最初内部存储为16473.599999999998,乘以1000将该初始错误放大到略低于16473600的数字。现在int将向下舍入到16473599。

@ R.T发布的资源。对于更详细的解释是好的阅读:Floating Point Arithmetic in Python

答案 3 :(得分:1)

float的精确度有限。因此,在一定数量的数字(根据用户2357112为16)之后,它变得不准确。如果float稍微低于最接近的整数,则仅在使用int( )进行转换时会出错。用round( )更好地包装参数:

x = '16473.6'
y = str(int(round(float(x) * 1000)))
print y

输出:

16473600

答案 4 :(得分:1)

你应该知道花车不准确。这是因为内部表示是二进制而不是十进制系统。

组成示例1:真的可以表示为0.999999999999。现在如果你打电话给int(),你就不会得到1而是0。

你可以通过以下方式解决这个问题:

y = str(int(float(x) * 1000 + 0.5))