python - 当地板的数字比 // 大时,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()
失败,//
更大的数字是否不太准确?
解决方案
int()
不是问题。问题是当除以 时/
,结果是 a float
(这就是你需要 的原因int()
)。Afloat
使用固定数量的位来表示该值,因此如果位太多,它们会从数字的最低有效位结束。此外,当位被切断时会发生舍入。在十六进制中,更容易看到丢失的位。例如:
randomStuff = 0x979182375823975089237584250DEADBEEF
x = randomStuff * 1337
print(hex(int(x / 1337)))
print(hex(x // 1337))
这打印:
0x97918237582398000000000000000000000
0x979182375823975089237584250deadbeef
通过遍历float
,很多位被切断。
推荐阅读
- python - 我们可以使用 NLP 根据文本预测评分吗?
- ansible - Ansible 形成列表或分离字典
- javascript - 在Praat中拖放:如果我们要开发这个功能,该怎么做?
- c# - Visual Studio - C# 控制台应用程序 - 如何编写单元测试和可测试代码
- google-cloud-dataflow - 在更新 Dataflow 管道时强制更新 SideInput
- office-js - Excel 插件自定义函数与现有 com 插件 UDF 兼容
- sql-server - 通过 XML 转换为 varbinary 的 SQL 字符串与 nvarchar 不同
- dialogflow-es - 无法找到错误对话流履行的来源
- python - 有人能解释一下 root 函数在这个快速联合实现中是如何工作的吗?
- get - 如何获得使用popen传递的“GET /”请求的响应与底层openssl通信