Python浮点到整数的转换

Python浮点到整数的转换,python,floating-point,int,Python,Floating Point,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(

基本上,我把一个浮点值转换成一个整数,但是我并不总是有期望的值

以下是我正在执行的代码:

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()):

2.51和4.02是在2.50->5.00范围内导致这种奇怪行为的唯一值。当给定相同的操作时,该范围内每隔两位数的值都会转换为int


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

使用二进制浮点表示法(Python是一种)的语言不能准确地表示所有的小数。如果计算结果为250.99999999999(可能是),则取整数部分将导致250

关于这个主题的一篇规范性文章是

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

您应该看看十进制模块,或者如果您必须在mpmath库中进行大量计算:),

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

>>> print "%.16f" % 2.51
2.5099999999999998
>>> 2.51*100
250.99999999999997
>>> 4.02*100
401.99999999999994
如果使用int(截断数字),则会得到:

250
401
看一看这个类型

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
def-toint(f):
trunc=int(f)
diff=f-trunc
#trunc太低了
如果abs(f-trunc-1)<0.00001:
返回trunc+1
#trunc太高了
如果abs(f-trunc+1)<0.00001:
返回trunc-1
#trunc是正确的值
返回trunc

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

浮点数不能精确表示小数。这不是Python的东西。可能重复的虽然其他人解释了为什么会发生这种情况,但我想展示我的解决方法,以获得对浮点错误具有一定容忍度的地板舍入
nfloor=lambda x:round(x*10**8)//10**8
int()
不会舍入到下面的整数,而是截断小数部分。例如:
int(-0.9)==0
“浮点数不是100%精确的”可以用“并非所有数字都可以用浮点数表示”(数字文字被转换为非常接近的浮点数,有时与数字相同)这一行来最精确地描述。事实上,所有浮点数都准确地表示它们所表示的值。关键的一点是,它们并不代表所有可能的数字。@EOL如果您允许,我可以在中编辑它,也可以自己编辑。谢谢。我编辑了你的答案;请随意改编我的散文以适应您的口味。:)关于二进制浮点数,需要知道的重要一点是(你可以从链接的文章中得到这个,但这里有一个TL;DR)二进制浮点数后面的数字表示二的负幂:二分之一,四分之一,八分之一,因此,二进制浮点数只能精确表示可用位表示的两个负幂之和的分数。某些分数在十进制表示法中是有限的(例如0.1),在二进制表示法中需要无限位数,因此不能完全用位数有限的
float
表示。
2.51 * 100 = 250.999999999997
int(round(2.51*100)) 
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