最近研究了下BigDecimal精度问题,发现稍不注意,就会丢失精度,下面是简单示例:
BigDecimal bigDecimal = new BigDecimal(12.432);
System.out.println("new BigDecimal => " +bigDecimal);
BigDecimal decimal1 = new BigDecimal("12.432");
System.out.println("new String BigDecimal => " + decimal1);
BigDecimal decimal = BigDecimal.valueOf(12.432);
System.out.println("valueOf BigDecimal => " +decimal);
double doubleValue = bigDecimal.doubleValue();
System.out.println("doubleValue BigDecimal => " +doubleValue);
String s = bigDecimal.toString();
System.out.println("toString BigDecimal => " + s);
int intValue = bigDecimal.intValue();
System.out.println("intValue BigDecimal => " + intValue);
上面对应输出:
new BigDecimal => 12.4320000000000003836930773104541003704071044921875
new String BigDecimal => 12.432
valueOf BigDecimal => 12.432
doubleValue BigDecimal => 12.432
toString BigDecimal => 12.4320000000000003836930773104541003704071044921875
intValue BigDecimal => 12
总结:
1、从上面可以看出构造方法:new BigDecimal(String s)、BigDecimal.valueOf()、BigDecimal.doubleValue()没有丢失精度,推荐使用String类型构造方法。
2、涉及到金额相关最好使用BigDecimal来定义。