Методы для проведения сложных вычислений в Java
Я должен реализовать некоторые относительно сложные формулы в приложении Java. Входные данные для этих формул включают до 30 или около того переменных. Некоторые из этих переменных в их естественной форме являются целыми числами, а некоторые - действительными с точностью от 3 до 4 десятичных знаков. Я использую commons-math для функций, но меня интересует точность и удобство:
Было бы лучше преобразовать все переменные целые числа в Double до перехода к методам формулы. Таким образом, в формулах есть согласованность, и, во-вторых, могу ли я безопасно использовать Double для точности от 3 до 4 dp? Существует ли "наилучшая практика" для реализации сложной математики в Java?
2 ответа
Нет необходимости конвертировать переменные Integers
в Double
, Инициализируйте все переменные как Double
потому что если у вас есть часть в формуле, где он просто делит 2 Integers
и добавляется к результату 30 переменных, тогда он потеряет значения для десятичных разрядов. Так что лучше всего использовать Double
для математических целей, где десятичные разряды важны для получения правильного ответа.
Для вычисления с плавающей точкой с точностью... Я бы предложил использовать BigDecimal. Потому что Double и Float известны своей потерей точности. Следующие фрагменты иллюстрируют проблему.
System.out.println( 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f );
System.out.println( 0.1d + 0.1d + 0.1d + 0.1d + 0.1d + 0.1d + 0.1d + 0.1d + 0.1d + 0.1d );
1.0000001
0.9999999999999999
Умножая 0,1 в десять раз, вы ожидаете получить 1. Но это не так.