我曾经使用BigDecimal,但是对于两个不同的(在数学上相同的)表达式,我仍然得到了不同的结果:
第一个表达式:PI - (10^(-14)/PI)
第二个表达式:(PI^2 - 10^(-14))/PI
更简单地说,这就是方程式:
执行此代码后,无论舍入的大小如何,最后一位数字始终不同。在我的情况下,我得到以下两个结果:
我的问题是为什么会发生这种情况,以及是否可以解决?
第一个表达式:PI - (10^(-14)/PI)
第二个表达式:(PI^2 - 10^(-14))/PI
更简单地说,这就是方程式:
![Equation with PI](https://istack.dev59.com/859EX.webp)
package set1;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class FloatingLaws {
final static BigDecimal PI = BigDecimal.valueOf(Math.PI);
public static void main(String[] args) {
System.out.println(firstExpression());
System.out.println(secondExpression());
}
private static BigDecimal secondExpression() {
return PI.subtract((BigDecimal.valueOf(Math.pow(10, -14)).divide(PI,50,RoundingMode.CEILING)));
}
private static BigDecimal firstExpression() {
return (PI.multiply(PI).subtract(BigDecimal.valueOf(Math.pow(10, -14)))).divide(PI, 50,RoundingMode.CEILING);
}
}
执行此代码后,无论舍入的大小如何,最后一位数字始终不同。在我的情况下,我得到以下两个结果:
3.14159265358978981690113816209304300915191180404867
3.14159265358978981690113816209304300915191180404866
我的问题是为什么会发生这种情况,以及是否可以解决?
BigDecimal
,但是我在你的代码中看到了很多“舍入模式”。在实际数学中(精度不受内存限制),在计算过程中进行四舍五入永远不是一个好主意,因为你得不到一个精确的答案。 - Arc676