在金融或电子商务应用程序中有很多货币价值计算,这引起了一个问题–我们应该使用double
还是float
数据类型来表示货币价值?
答:始终使用java.math.BigDecimal
表示货币值。
1.双倍还是浮动?
这是一个使用double
和float
表示Java中货币值的示例。
JavaMoney.java
package com.mkyong;
import java.text.DecimalFormat;
public class JavaMoney {
private static DecimalFormat df = new DecimalFormat("0.00");
public static void main(String[] args) {
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);
System.out.println("--------------------");
double i = 2.0;
double j = 1.7;
System.out.println("double : " + (i - j));
System.out.println("double : " + df.format(i - j));
float i2 = 2.0f;
float j2 = 1.7f;
System.out.println("float : " + (i2 - j2));
System.out.println("float : " + df.format(i2 - j2));
}
}
输出–无法精确计算所有小数。
0.8999999999999999
0.8
0.7
0.6000000000000001
0.5
0.3999999999999999
0.30000000000000004
0.19999999999999996
0.10000000000000009
0.0
--------------------
double : 0.30000000000000004
double : 0.30
float : 0.29999995
float : 0.30
2. BigDecimal
为了避免上述十进制问题,我们可以使用BigDecimal
表示货币值; 此外,我们可以更直接地控制BigDecimal
比例。
JavaMoney2.java
package com.mkyong;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class JavaMoney2 {
public static void main(String[] args) {
System.out.println("--- BigDecimal-----");
System.out.println(BigDecimal.valueOf(2.00).subtract(BigDecimal.valueOf(1.1)));
System.out.println(BigDecimal.valueOf(2.00).subtract(BigDecimal.valueOf(1.2)));
System.out.println(BigDecimal.valueOf(2.00).subtract(BigDecimal.valueOf(1.3)));
System.out.println(BigDecimal.valueOf(2.00).subtract(BigDecimal.valueOf(1.4)));
System.out.println(BigDecimal.valueOf(2.00).subtract(BigDecimal.valueOf(1.5)));
System.out.println(BigDecimal.valueOf(2.00).subtract(BigDecimal.valueOf(1.6)));
System.out.println(BigDecimal.valueOf(2.00).subtract(BigDecimal.valueOf(1.7)));
System.out.println(BigDecimal.valueOf(2.00).subtract(BigDecimal.valueOf(1.8)));
System.out.println(BigDecimal.valueOf(2.00).subtract(BigDecimal.valueOf(1.9)));
System.out.println(BigDecimal.valueOf(2.00).subtract(BigDecimal.valueOf(2)));
System.out.println("--------------------");
BigDecimal i = BigDecimal.valueOf(2.0);
BigDecimal j = BigDecimal.valueOf(1.7);
System.out.println("double : " + i.subtract(j));
System.out.println("double : " + i.subtract(j).setScale(5, RoundingMode.HALF_UP));
}
}
输出– BigDecimal
执行精确的十进制算术运算。
--- BigDecimal-----
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0.0
--------------------
double : 0.3
double : 0.30000
参考文献
翻译自: https://mkyong.com/java/how-do-calculate-monetary-values-in-java-double-vs-bigdecimal/