我正在研究Java语言中的Math.pow()函数,但是下面的代码给出了不同的结果,分别如下所示。
案例1:
BigDecimal divisor = new BigDecimal(Math.pow(10,9)+7);
BigDecimal dividend = new BigDecimal(1000000000543543509L);
System.out.println(dividend.remainder(divisor)); // 543543558案例2:
System.out.println((1000000000543543509L%((int)Math.pow(10,9)+7))+"");
//543543558案例3:
System.out.println((1000000000543543509L%(Math.pow(10,9)+7))+""); //5.43543601E8为什么我在案例2和案例3中得到不同的结果,而在案例1和案例2中得到相同的结果?以上哪种情况最准确?
发布于 2017-09-29 03:22:56
在前两种情况下,long的值保留了long的所有精度。在第三种情况下,long被强制转换为double,并且一些精度会丢失。请注意,pow返回一个双精度值,double + int会将int转换为双精度值。同样,long%double会导致long类型转换为double。
我们可以通过显式执行强制转换来演示结果:
System.out.println((long)((double)1000000000543543509L));
#1000000000543543552您可以使用模数来验证该值是否为op得到的值。
System.out.println(1000000000543543552L%((int)(Math.pow(10, 9) + 7)));
#543543601所以问题不在于功率,而在于长度不适合双倍大小。
更广泛地说,如果我们参考Widening Primitive Conversion上的jls,我们可以看到long可以在没有显式强制转换的情况下提升为double (或float)。这是因为它不会丢失任何量级信息。尽管如本例所示,您可能会丢失一些精度。
https://stackoverflow.com/questions/46476565
复制相似问题