Javaで金額を計算する方法
金額は、通常、金融または電子商取引アプリケーションでプログラムされます。 「お金」の値を扱うときは、常に疑問が生じます。金銭的価値を表すためにdoubleまたはfloatデータ型を使用する必要がありますか?
Answer:常にjava.math.BigDecimalを使用して金銭的価値を表します。
1. 金額-ダブル
以下は、Javaで金銭的価値を表すためにdoubleを使用する例です。
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);
}
}
出力-すべての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
上記の10進数の問題を回避するために、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は、正確な10進数の算術演算を実行します。
--- BigDecimal----- 0.90 0.80 0.70 0.60 0.50 0.40 0.30 0.20 0.10 0.00
Note
BigDecimalの計算は、プリミティブ型の計算よりも低速です。これは、ミッションクリティカルな計算アプリケーションで問題になる可能性があります。 ほとんどの電子商取引アプリケーションでは、問題ないはずです。