【Python】int(a/b) 和 a//b 之间的巨大区别

开始

在求解的同时
int(a/b) 和 a//b 之间的区别
因为诧异于 WA 和 AC 的变化,所以研究了其中的差异。

结论:

通过“a/b 返回 float,a//b 返回 int”,
区别在于是否发生溢出。

下面的代码不起作用

import math
a, b, c = map(int, input().split())

gcd = math.gcd(a, b)
gcd = math.gcd(gcd, c)
# 如果 1000000000000000000 999999999999999999 999999999999999998
# gcd == 1

a = int(a/gcd) - 1
b = int(b/gcd) - 1
c = int(c/gcd) - 1

print(a+b+c)
 % python3 022_cubic_cake.py
1000000000000000000 999999999999999999 999999999999999998
2999999999999999997

下面的代码运行良好

import math
a, b, c = map(int, input().split())

gcd = math.gcd(a, b)
gcd = math.gcd(gcd, c)
# 如果1000000000000000000 999999999999999999 999999999999999998
# gcd == 1

a = a//gcd - 1 # 这是与上面的区别
b = b//gcd - 1 # 这是与上面的区别
c = c//gcd - 1 # 这是与上面的区别

print(a+b+c)

这个纯粹的问题点出 int(a/b) 和 a//b 之间的区别。

两者区别

查看下面的python文档
内置类型

  • int 没有精度上限。
  • float 是作为 C double 实现的。

另外,如果请查看下面的文档
浮点算术:争议和限制
事实证明,对于float来说,数字只能到第53位。
因为大于 53 位的数字只是近似值,所以无法产生正确的结果。
而事实上,这次处理的数字超过了53位。

 % python3
>>> 2**53<1000000000000000000
True

换而言之,两者的区别在于准确率有上限吗?

事实证明确实如此:
具体而言,int 没有精度上限,float 的精度上限为 53 位。

概括

使人诧异的是整数(int)的精度没有上限……!
从今以后,将尽可能避免 int(a/b) ,并使用 a//b 代替。

猜你喜欢

转载自blog.csdn.net/Allan_lam/article/details/134932566