я использую BigDecimal, но я все еще получаю разные результаты для двух различных (математически идентичных) выражений:Java BigDecimal - объяснение необходимости
Первое выражение: PI - (10^(- 14)/PI)
Второе выражение: (PI^2 - 10^(- 14))/PI
Выражаясь более просто, здесь есть уравнение:
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
Мой вопрос: почему это происходит и разрешимо ли это?
Действительно ли это вас касается? – Idos
Да, это действительно так :) – mrGreenBrown
Я никогда не использовал 'BigDecimal', но я вижу много« округления »в вашем коде. Округление _ в середине вычисления не является хорошей идеей (в реальной математике, где точность не ограничена памятью), потому что вы не получите точного ответа. – Arc676