首页 > 解决方案 > 当地板的数字比 // 大时,int() 的准确性会降低吗?

问题描述

所以我只是修改了一些我觉得更适合我的风格的东西,来自另一个人的算法的答案。我决定改变的一件事,当时一点也不困惑,就是改变他们放置 a 的所有地方,并//围绕int()整个计算,给我同样的结果。现在,当我完成所有这些小细节的更改时,我以为测试用例会通过……我错了。下面的函数应该做同样的事情,如果给定的示例要通过它应该返回的函数,则返回所有给定的分数(以...例如的格式[[1, 2], [1, 3], [1, 4]])具有相同的公分母[[6, 12], [4, 12], [3, 12]]

用于int()返回(最后一位):

from math import gcd
from functools import reduce

def convertFracts(lst):
    if not lst: return []
    lcm = lambda a, b: int(a*b / gcd(a, b))
    denom_list = (i[1] for i in lst)
    lcm_num = reduce(lcm, denom_list)
    return [[int(i[0]*lcm_num / i[1]), lcm_num] for i in lst]

用于//返回(最后一位):

from math import gcd
from functools import reduce

def convertFracts(lst):
    if not lst: return []
    lcm = lambda a, b: int(a*b / gcd(a, b))
    denom_list = (i[1] for i in lst)
    lcm_num = reduce(lcm, denom_list)
    return [[i[0]*lcm_num // i[1], lcm_num] for i in lst]

int()使用时失败但使用时通过的测试用例//包含非常大的分数:

[[27115, 5262], [87546, 11111111], [43216, 255689]]

这是使用时的结果int()

[[77033412951888080, 14949283383840498], [117787497858828, 14949283383840498], [2526695441399712, 14949283383840498]]

但它不等于正确答案:

[[77033412951888085, 14949283383840498], [117787497858828, 14949283383840498], [2526695441399712, 14949283383840498]]

当使用//而不是int()返回位时,它通过了......我的问题是,为什么没有int()失败,//更大的数字是否不太准确?

标签: pythonpython-3.xalgorithm

解决方案


int()不是问题。问题是当除以 时/,结果是 a float(这就是你需要 的原因int())。Afloat使用固定数量的位来表示该值,因此如果位太多,它们会从数字的最低有效位结束。此外,当位被切断时会发生舍入。在十六进制中,更容易看到丢失的位。例如:

randomStuff = 0x979182375823975089237584250DEADBEEF
x = randomStuff * 1337
print(hex(int(x / 1337)))
print(hex(x // 1337))

这打印:

0x97918237582398000000000000000000000
0x979182375823975089237584250deadbeef

通过遍历float,很多位被切断。


推荐阅读