为什么Python的浮点计算结果不正确

5 投票
5 回答
7515 浏览
提问于 2025-04-18 18:01
x = '16473.6'
y = str(int(float(x) * 1000))
print(y)

>>>16473599

好的...显然我做错了什么...我知道在C#中处理浮点数有时候会有点难...但我以为乘以1000就能解决问题...结果是错的

有没有人能告诉我怎么做得更好?

非常感谢

5 个回答

1

float 类型的数字精度是有限的。这意味着在某个数字位数之后(根据用户2357112的说法,大约是16位),它的准确性就会下降。如果一个浮点数稍微低于最近的整数,直接用 int( ) 转换时可能会出错。为了避免这个问题,最好先用 round( ) 来处理这个数字:

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

输出结果:

16473600
2

你需要知道,浮点数并不是完全准确的。这是因为计算机内部使用的是二进制,而不是我们平常用的十进制。

举个简单的例子:0.999999999999 其实可能被表示成 0.999999999999。如果你对这个数字使用 int() 函数,你得到的结果不会是 1,而是 0。

你可以通过一些方法来解决这个问题,比如:

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

这段内容很有意思,它展示了为什么在使用浮点数时要小心,特别是在把它们转换成 int 类型的时候。

主要的问题是,int 函数总是会向下取整,而不是“取最近的整数”。

所以,即使:

>>> 16473.6
16473.6

实际上也可以说:

>>> 16473.6*1000
16473599.999999998

你最初的浮点数在内部表示时,只有前16位小数是准确的。它最开始是以 16473.599999999998 的形式存储的,而乘以 1000 后,这个初始的误差被放大了,变成了一个稍微低于 16473600 的数字。现在 int 会向下取整,结果是 16473599。

@R.T. 提供的资源是个不错的阅读材料,可以更详细地解释这个问题:Python 中的浮点数运算

4

你也可以试试这个:

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

这样可以消除浮点数的近似问题。

4

浮点数在计算时总是会遇到一些问题,因为它是基于数字的二进制近似值来进行计算的。

你可以查看 浮点运算:问题和限制 来了解更多。

你也可以尝试使用 Decimal 来进行更精确的计算。

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

撰写回答