double的模结果不正确



代码如下(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

r1r2应该是相同的,但它们不是,为什么?是因为Math.pow(10, 9) + 7double吗?如果是这样,为什么double类型会导致问题?double不是分数,结果不应该是一致的吗?

当您使用%longdouble操作数时,应用数字提升。将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)

(使用一个

我希望我帮到你了。

最新更新