Как рассчитать денежные значения в Java
Денежные значения обычно программируются в приложении для финансов или электронной коммерции. Когда вы имеете дело с «денежной» стоимостью, всегда возникает вопрос - следует ли мне использовать тип данныхdouble
илиfloat
для представления денежных значений?
Answer: всегда используетjava.math.BigDecimal
для представления денежных значений.
1. Денежные ценности - двойные
Вот пример использования double для представления денежных значений в Java.
MoneyDouble.java
package com.example.test; public class MoneyDouble { public static void main(String[] argv) { System.out.println("--- Normal Print-----"); System.out.println(2.00 - 1.1); System.out.println(2.00 - 1.2); System.out.println(2.00 - 1.3); System.out.println(2.00 - 1.4); System.out.println(2.00 - 1.5); System.out.println(2.00 - 1.6); System.out.println(2.00 - 1.7); System.out.println(2.00 - 1.8); System.out.println(2.00 - 1.9); System.out.println(2.00 - 2); } }
Вывод - он не может точно вычислить все двойные десятичные дроби.
--- Normal Print----- 0.8999999999999999 0.8 0.7 0.6000000000000001 0.5 0.3999999999999999 0.30000000000000004 0.19999999999999996 0.10000000000000009 0.0
2. Денежные значения - BigDecimal
Чтобы избежать проблемы с десятичным числом, описанной выше, вы можете использоватьBigDecimal
для представления денежных значений.
MoneyBigDecimal.java
package com.example.test; import java.math.BigDecimal; public class MoneyBigDecimal { public static void main(String[] argv) { System.out.println("--- BigDecimal-----"); System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.1"))); System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.2"))); System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.3"))); System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.4"))); System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.5"))); System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.6"))); System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.7"))); System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.8"))); System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.9"))); System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("2"))); } }
Вывод - BigDecimal выполняет точную десятичную арифметику.
--- BigDecimal----- 0.90 0.80 0.70 0.60 0.50 0.40 0.30 0.20 0.10 0.00
Note
Вычисления BigDecimal выполняются медленнее, чем вычисления с примитивным типом, что может быть проблемой для критически важного вычислительного приложения. Для большинства приложений электронной коммерции это должно быть хорошо.