代码如下(Java):
long num = 988530483551494950L;
int r1 = (int) (num % (Math.pow(10, 9) + 7));
int r2 = (int) (num % 1000000007);
System.out.println(r1); // 631781580
System.out.println(r2); // 631781618
r1
和r2
应该是相同的,但它们不是,为什么?是因为Math.pow(10, 9) + 7
是double
吗?如果是这样,为什么double
类型会导致问题?double
不是分数,结果不应该是一致的吗?
当您使用%
与long
和double
操作数时,应用数字提升。将long
转换为double
,然后进行余数运算。
但是,double
不能精确地表示988530483551494950。最接近的表示表示值988530483551494912(参见此处的转换)。
事实上,988530483551494912除以10000000007的余数是631781580——"错误的";你得到的答案。
%
运算符对整数和小数的处理方式不同。在您的代码中,r2
是整数运算符的结果,r1
是小数(Math#pow
的结果是double
)。如果你想要r1 == r2
,那么:
- 设置num为double类型
- 数学。pow(10,9) + 7 to int or long
- 设置
1000000007
为双类型(1000000007d
)
(使用一个
我希望我帮到你了。