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范围内出现这种奇怪行为的唯一值。当给定相同的操作时,该范围内的其他每两位数值转换为 int 没有任何问题。

那么,我遗漏了什么导致了这些结果呢? 顺便说一下,我正在使用 Python2.7.2。

369454 次浏览

使用二进制浮点表示的语言(Python 是其中之一)不能精确地表示所有的小数值。如果您的计算结果是250.999999999999(可能是) ,那么取整数部分将导致250。

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

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

浮点数不准确。在本例中,它是250.99999999999999999,实际上非常接近251,但是 int ()截断了小数部分,在本例中是250。

您应该看一下 Decimal 模块,或者如果需要在 mpath 库 http://code.google.com/p/mpmath/中进行大量计算,则可以使用它:) ,

计算机科学家应该知道的浮点数算法

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

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

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

250
401

看看 小数点后类型。

2.51 * 100 = 250.999999999997

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

int(round(2.51*100))

得到251作为整数。通常,浮点数不能精确表示。因此,应该小心舍入错误。如前所述,这不是特定于 Python 的问题。这是所有计算机语言中反复出现的问题。

正如其他人提到的,int通过截断进行转换。这可能导致答案与预期的不同。解决这个问题的一种方法是检查结果是否“足够接近”一个整数,并相应地进行调整,否则就是通常的转换。这是假设您不会得到太多的舍入和计算错误,这是一个单独的问题。例如:

def toint(f):
trunc = int(f)
diff = f - trunc


# trunc is one too low
if abs(f - trunc - 1) < 0.00001:
return trunc + 1
# trunc is one too high
if abs(f - trunc + 1) < 0.00001:
return trunc - 1
# trunc is the right value
return trunc

此函数将调整接近整数的 off-by-one 错误。mpmath库对接近整数的浮点数执行类似的操作。

要转换为 int,应该使用 int()函数:

def myFunction(x, y):
return int(x / y)

但是,如果 x/y 类似于2.8,则 int()将删除小数并将其转换为2。为此,你应该在使用 int()之前使用 round()函数,它看起来像这样:

def myFunction(x, y):
return int(round(x / y))