gpt4 book ai didi

Java:Math.pow 返回令人困惑的结果

转载 作者:行者123 更新时间:2023-11-30 06:29:14 26 4
gpt4 key购买 nike

我正在研究 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 中得到相同的结果?上述哪种情况最准确?

最佳答案

在前两种情况下,long 值保留了 long 的所有精度。在第三种情况下,long 被转换为 double,并且一些精度会丢失。请注意,pow 返回一个 double,而 double + int 会导致 int 转换为 double。同样,long%double 会导致 long 转换为 double。

我们可以通过显式执行转换来演示结果:

System.out.println((long)((double)1000000000543543509L));
#1000000000543543552

您可以使用取模来验证该值是 op 获得的值。

System.out.println(1000000000543543552L%((int)(Math.pow(10, 9) + 7)));
#543543601

所以问题不在于 pow,而在于 long 不适合 double。

更一般地说,如果我们查阅 Widening Primitive Conversion 上的 jls我们可以看到,无需显式强制转换,long 就可以提升为 double(或 float)。这是因为它不会丢失任何震级信息。尽管如本示例所示,您可能会损失一些精度。

关于Java:Math.pow 返回令人困惑的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46476565/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com