Как рассчитать денежные значения в 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 выполняются медленнее, чем вычисления с примитивным типом, что может быть проблемой для критически важного вычислительного приложения. Для большинства приложений электронной коммерции это должно быть хорошо.