Пример в этой статье описывает метод работы BigDecimal в Java. Поделитесь этим со всеми для справки. Конкретный анализ заключается в следующем:
Поскольку значения double и float недостаточно точны, при выполнении коммерческих вычислений необходимо использовать BigDecimal. Объект BigDecimal создается следующим образом:
Скопируйте код следующим образом: BigDecimal b = new BigDecimal("12.000001");
System.out.println(б);
Результат вывода: 12.000001;
BigDecimal можно передать в String и double при его создании, но лучше всего использовать String. Что касается причины, просто посмотрите на следующий код:
Скопируйте код следующим образом: BigDecimal b = new BigDecimal("12.000001");
System.out.println(б);
BigDecimal c = новый BigDecimal(12.01);
System.out.println(c);
Результат работы:
12.000001
12.00999999999999997868371792719699442386627197265625
Видно, что точность будет потеряна при передаче double.
Другие операции BigDecimal следующие:
Скопируйте код. Код выглядит следующим образом: //Дополнение.
public static BigDecimal add(String num1, String num2) {
BigDecimal bd1 = новый BigDecimal(num1);
BigDecimal bd2 = новый BigDecimal(num2);
вернуть bd1.add(bd2);
}
//Вычитание
public static BigDecimal вычитание (String num1, String num2) {
BigDecimal bd1 = новый BigDecimal(num1);
BigDecimal bd2 = новый BigDecimal(num2);
вернуть bd1.subtract(bd2);
}
//умножение
public static BigDecimal умножить (String num1, String num2) {
BigDecimal bd1 = новый BigDecimal(num1);
BigDecimal bd2 = новый BigDecimal(num2);
вернуть bd1.multiply(bd2);
}
//разделение
public static BigDecimal div(String num1, String num2, int i) {
BigDecimal bd1 = новый BigDecimal(num1);
BigDecimal bd2 = новый BigDecimal(num2);
// i — количество цифр, которые необходимо сохранить, BigDecimal.ROUND_HALF_UP представляет правило округления
return bd1.divide(bd2, i, BigDecimal.ROUND_HALF_DOWN);
}
Необходимо подчеркнуть деление. Третий параметр – округлять ли.
ROUND_HALF_DOWN означает, что 1 не будет введена, если встречается 5, то есть 1,5->1;
ROUND_HALF_UP означает, что при встрече 5 вводится 1, то есть 1,5->2;
Но есть некоторые вещи, на которые следует обратить внимание:
Когда мы используем ROUND_HALF_DOWN, скопируйте код следующим образом: System.out.println(this.divide("67.75", "5",4));
System.out.println(this.divide("67,75", "5",1));
System.out.println("-------");
System.out.println(this.divide("67.751", "5",4));
System.out.println(this.divide("67.751", "5",1));
Результаты бега следующие:
13.5500
13,5
-------
13.5502
13,6
Я растерялся. По логике второй результат должен быть 13,5! Почему стало 13,6? После многих тестов я подумал об этом и обнаружил, что это округление основано не на сдвиге после точной цифры и не сравнивает ее с 5, а все данные после точной цифры сравниваются с 5. Другими словами: 13,5500 с точностью до одну цифру, затем используйте 0,0500 для сравнения с 5, а 13,5502 — с точностью до одной цифры, затем используйте 0,0502 для сравнения с 5. Оно больше 5, поэтому закрывается вверх.
Я надеюсь, что эта статья будет полезна каждому, кто занимается программированием на Java.