繁体   English   中英

Python float 到 int 的转换

[英]Python float to int conversion

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

这是我正在执行的代码:

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 没有任何问题。

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

2.51 * 100 = 250.999999999997

int() function 只是截断小数点处的数字,给出 250。使用

int(round(2.51*100)) 

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

每个计算机科学家都应该知道的关于浮点运算的知识

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

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

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

250
401

看看Decimal类型。

使用二进制浮点表示的语言(Python 就是其中之一)不能准确地表示所有小数值。 如果您的计算结果是 250.99999999999(它可能是),那么采用 integer 部分将得到 250。

关于这个主题的一篇规范文章是What Every Computer Scientist Should Know About Floating-Point Arithmetic

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

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

您应该看看 Decimal 模块,或者如果您必须在 mpmath 库http://code.google.com/p/mpmath/中进行大量计算 :),

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

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

此 function 将针对接近整数的非一误差进行调整。 mpmath库对接近整数的浮点数执行类似的操作。

要转换为 int,您应该使用int() function

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

但是,如果 x / y 类似于 2.8,则int()将删除小数并将其转换为 2。为此,您应该在使用int()之前使用round() function,如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM