作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究 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/
很抱歉新手的问题,但是: 我最近才发现“=”运算符不只是处理对象/等等。值(value),也是引用。这很酷,但我认为这对变量来说是不一样的,它不会在存储整数或 float 的变量之间创建引用。后来我觉
我是一名优秀的程序员,十分优秀!