Java之BigDecimal
背景:经常看到开发在计算金额的时候,使用的并不是double类型,而是一种叫BigDecimal的类,好奇持续了一段时间,等把手头的事儿告一段落了,返回来搜索了一下。
做了下面这个例子,发现用double来做减法,会损失精度,话说我也是第一次知道double类型的10.0-7.9竟然不等于2.1,好吧,看来还是基础不太牢靠。
package com.daylywork.leetcode;
import java.math.BigDecimal;
public class MyBigD {
public static void main(String[] args){
double a = 10.0;
double b = 7.9;
System.out.println("两个double做减法="+(a-b));
BigDecimal c = new BigDecimal(a);
BigDecimal d =new BigDecimal(b);
System.out.println("通过double来构造BigDecimal做减法="+c.subtract(d));
BigDecimal e = new BigDecimal("10.0");
BigDecimal f = new BigDecimal("7.9");
System.out.println("通过将double转化为字符串来构造BigDecimal做减法="+e.subtract(f));
System.out.println("通过将double转化为字符串来构造BigDecimal做加法="+e.add(f));
System.out.println("通过将double转化为字符串来构造BigDecimal做乘法="+e.multiply(f));
BigDecimal g = new BigDecimal("10.0");
BigDecimal i = new BigDecimal("5.0");
System.out.println("通过将double转化为字符串来构造BigDecimal做除法="+g.divide(i));
System.out.println("通过将double转化为字符串来构造BigDecimal做除法="+e.divide(f));
}
}
结果
两个double做减法=2.0999999999999996
通过double来构造BigDecimal做减法=2.0999999999999996447286321199499070644378662109375
通过将double转化为字符串来构造BigDecimal做减法=2.1
通过将double转化为字符串来构造BigDecimal做加法=17.9
通过将double转化为字符串来构造BigDecimal做乘法=79.00
通过将double转化为字符串来构造BigDecimal做除法=2
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide(BigDecimal.java:1693)
at com.daylywork.leetcode.MyBigD.main(MyBigD.java:21)
Process finished with exit code 1
结论:遇到计算金额的时候,最好是使用BigDecimal
祝自己:每天进步一点点