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の計算は、プリミティブ型の計算よりも低速です。これは、ミッションクリティカルな計算アプリケーションで問題になる可能性があります。 ほとんどの電子商取引アプリケーションでは、問題ないはずです。