How to round BigDecimal money calculations in Java to 2 decimal places using the best RoundingMode?

How to round BigDecimal money calculations in Java to 2 decimal places using the best RoundingMode?

4 Березня 2024 в 12:51 51

В Java для округлення розрахунків з грошима до двох десяткових знаків використовують клас BigDecimal. Але як вибрати найкращий метод округлення? Давайте розглянемо це питання.

Припустимо, що у нас є BigDecimal amount і ще один BigDecimal tax. Ми хочемо виконати наступний розрахунок: amountWithoutTax = amount – tax. amount і tax повинні бути в форматі YYYY.XX (тобто з точністю 2 десяткових знаків). Це означає, що amountWithoutTax також повинен мати точність 2. Однак, в надзвичайному випадку amount або tax мають точність 3 або більше, amountWithoutTax також буде мати точність 3 або більше.

Який варіант є найбільш відповідним з точки зору округлення? Коли йдеться про гроші, $45.134 не має сенсу, оскільки немає монет з меншою вартістю, ніж цент.

Ось варіанти, які ми маємо за допомогою класу RoundingMode:

На даний момент ми використовуємо CEILING, тобто просте округлення вгору. Але, як чесно визнати, я просто випадково вибрав цей варіант. Як я можу знати, який є офіційний або правильний спосіб робити це?