x = '16473.6'
y = str(int(float(x) * 1000))
print(y)
>>>16473599
好吧......显然我做错了什么......我知道这些浮动的东西有时候从c#有点困难......但我认为* 1000应该有用......好错了
有人可以告诉我如何做得更好吗?
非常感谢
答案 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))