Python浮点数转换为整数
基本上,我是在把一个浮点数(小数)转换成整数,但我得到的结果并不总是我预期的。
这是我执行的代码:
x = 2.51
print("--------- 251.0")
y = 251.0
print(y)
print(int(y))
print("--------- 2.51 * 100")
y = x * 100
print(y)
print(int(y))
print("--------- 2.51 * 1000 / 10")
y = x * 1000 / 10
print(y)
print(int(y))
print("--------- 2.51 * 100 * 10 / 10")
y = x * 100 * 10 / 10
print(y)
print(int(y))
x = 4.02
print("--------- 402.0")
y = 402.0
print(y)
print(int(y))
print("--------- 4.02 * 100")
y = x * 100
print(y)
print(int(y))
print("--------- 4.02 * 1000 / 10")
y = x * 1000 / 10
print(y)
print(int(y))
print("--------- 4.02 * 100 * 10 / 10")
y = x * 100 * 10 / 10
print(y)
print(int(y))
这是结果(第一个值是操作的结果,第二个值是对同一操作使用int()得到的结果):
--------- 251.0
251.0
251
--------- 2.51 * 100
251.0
250
--------- 2.51 * 1000 / 10
251.0
251
--------- 2.51 * 100 * 10 / 10
251.0
250
--------- 402.0
402.0
402
--------- 4.02 * 100
402.0
401
--------- 4.02 * 1000 / 10
402.0
401
--------- 4.02 * 100 * 10 / 10
402.0
401
在2.50到5.00这个范围内,只有2.51和4.02这两个值会导致这种奇怪的行为。这个范围内的其他两位数值在进行相同操作时,转换成整数都没有问题。
那么,我缺少了什么,才会导致这些结果呢?顺便提一下,我使用的是Python 2.7.2。
6 个回答
12
使用二进制浮点数表示法的编程语言(比如Python)不能准确表示所有的小数值。如果你的计算结果是250.99999999999(有可能会出现这样的情况),那么取整数部分就会得到250。
关于这个话题,有一篇经典的文章叫做 每个计算机科学家都应该知道的浮点运算。
35
浮点数并不能表示所有的数字。特别是像2.51这样的数字,浮点数无法准确表示,它只能用一个非常接近它的数字来表示:
>>> print "%.16f" % 2.51
2.5099999999999998
>>> 2.51*100
250.99999999999997
>>> 4.02*100
401.99999999999994
如果你使用int类型,它会把数字截断,这样你得到的结果是:
250
401
可以看看Decimal类型。
97
2.51 * 100 = 250.999999999997
int()
这个函数的作用就是把数字的小数部分去掉,结果变成250。如果你想得到251这个整数,可以使用
int(round(2.51*100))
。一般来说,浮点数(也就是带小数的数字)不能被完全准确地表示。所以在使用的时候要小心可能出现的四舍五入错误。正如之前提到的,这并不是Python特有的问题,所有编程语言都有可能遇到这个问题。