Python浮动到int转换

基本上,我将一个浮点数转换为一个整数,但我并不总是有预期的价值。

这里是我正在执行的代码:

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.51和4.02是导致2.50 – > 5.00范围内的奇怪行为的唯一值。 当给定相同的操作时,该范围内的每隔两位数字都将毫无问题地转换为整数。

那么,我错过了什么导致了这些结果呢? 顺便说一句,我正在使用Python 2.7.2。

 2.51 * 100 = 250.999999999997 

int()函数简单地截断小数点处的数字,给出250

 int(round(2.51*100)) 

得到251作为一个整数。 一般来说,浮点数不能精确表示。 因此,应该小心舍入误差。 如上所述,这不是Python特有的问题。 这是所有计算机语言中反复出现的问题。

计算机科学家应该知道什么是浮点运算

浮点数不能代表所有的数字。 特别是,2.51不能用浮点数来表示,用一个非常接近的数来表示:

 >>> print "%.16f" % 2.51 2.5099999999999998 >>> 2.51*100 250.99999999999997 >>> 4.02*100 401.99999999999994 

如果你使用int来截断数字,你会得到:

 250 401 

看看十进制types。

使用二进制浮点表示(Python是一种)的语言不能完全表示所有的小数值。 如果您的计算结果是250.99999999999(可能是),那么取整数部分将导致250。

关于这个主题的规范文章是每个计算机科学家应该知道的浮点运算 。

 >>> x = 2.51 >>> x*100 250.99999999999997 

浮点数是不准确的。 在这种情况下,它是250.99999999999999,这实际上接近于251,但是int()会截断小数部分,在本例中为250。

你应该看看Decimal模块,或者如果你需要在mpmath库http://code.google.com/p/mpmath/ :)上进行大量的计算,