zoukankan      html  css  js  c++  java
  • 【Java】使用BigDecimal类进行精确小数计算

    在商业计算中(尤其是计算价格)需要使用BigDecimal类来进行精确小数计算,因为用其他类型计算(如double)得到的结果不是精确的!

    写个测试类。

    import org.junit.Test;
    import java.math.BigDecimal;
    
    public class BigDecimalTest {
    
        @Test
        public void test1(){
            System.out.println(0.05 + 0.01); // 0.060000000000000005
            System.out.println(1 - 0.42);    // 0.5800000000000001
            System.out.println(4.015 * 100); // 401.49999999999994
            System.out.println(123.3 / 100); // 1.2329999999999999
        }
    
        @Test
        public void test2(){
            BigDecimal b1 = new BigDecimal(0.05);
            BigDecimal b2 = new BigDecimal(0.01);
            System.out.println(b1.add(b2)); // 0.06000000000000000298372437868010820238851010799407958984375
        }
    
        @Test
        public void test3(){
            BigDecimal b1 = new BigDecimal("0.05");
            BigDecimal b2 = new BigDecimal("0.01");
            System.out.println(b1.add(b2)); // 0.06
        }
    }

    小结一:关于BigDecimal类的使用方法。

    • System.out.println()中的数字默认是double类型的,double类型小数计算不精准。
    • 使用BigDecimal类构造方法传入double类型时,计算的结果也是不精确的!必须改用传入String的构造方法。这一点在BigDecimal类的构造方法注释中有说明。
    • 实际项目中,数据库存的通常是float或double类型,所以计算时需要频繁进行转换,通常需要单独封装一个转换方法。

    封装一个工具类BigDecimalUtil.java

    import java.math.BigDecimal;
    
    public class BigDecimalUtil {
    
        // 私有构造方法,防止外部new
        private BigDecimalUtil(){}
    
        // 加法。
        public static BigDecimal add(double v1, double v2){
            BigDecimal b1 = new BigDecimal(Double.toString(v1));
            BigDecimal b2 = new BigDecimal(Double.toString(v2));
            return b1.add(b2);
        }
    
        // 减法。
        public static BigDecimal sub(double v1, double v2){
            BigDecimal b1 = new BigDecimal(Double.toString(v1));
            BigDecimal b2 = new BigDecimal(Double.toString(v2));
            return b1.subtract(b2);
        }
    
        // 乘法。
        public static BigDecimal mul(double v1, double v2){
            BigDecimal b1 = new BigDecimal(Double.toString(v1));
            BigDecimal b2 = new BigDecimal(Double.toString(v2));
            return b1.multiply(b2);
        }
    
        // 除法。
        public static BigDecimal div(double v1, double v2){
            BigDecimal b1 = new BigDecimal(Double.toString(v1));
            BigDecimal b2 = new BigDecimal(Double.toString(v2));
            return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP); // 四舍五入,保留2位小数
        }
    }

    小结二:关于JUnit单元测试的使用方法。

    • 新建一个类做单元测试,通常在目录“项目名/src/test/java/”下。
    • 编写测试方法,标注上@Test,即可右键运行该测试方法,而不需要写主函数调用。
  • 相关阅读:
    互联网公司笔试常见陷阱
    华为机试题(地铁换乘,图的应用)
    容器(vector)、数组、new创建的动态数组,你到底用哪一个(执行效率分析)
    SpringMVC全局异常
    github commit contributions无记录
    elasticSearch之查询
    nginx负载均衡策略
    docker入门
    解决centos&win安装安装elasticSearch无法运行
    2017年终总结
  • 原文地址:https://www.cnblogs.com/guxin/p/java-big-decimal-example.html
Copyright © 2011-2022 走看看