Java之BigDecimal

112 阅读1分钟

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

祝自己:每天进步一点点