• java BigDecimal使用


    一、BigDecimal的加减乘除:

    package com.cy.test.math;
    
    import java.math.BigDecimal;
    
    public class TestBigDecimal {
        public static void main(String[] args) {
            //加法
            double d1 = 1.234;
            double d2 = 2.341;
            System.out.println(d1 + d2);    //3.575
    
            System.out.println(d1 * d2);    //2.8887940000000003精度出问题了
            System.out.println(d1 / d2);    //0.5271251601879539 这个是对的
    
            //使用BigDecimal,加法
            BigDecimal b1 = new BigDecimal(Double.toString(d1));
            BigDecimal b2 = new BigDecimal(Double.toString(d2));
            System.out.println(b1.add(b2).doubleValue());       //3.575
    
            //减法
            System.out.println(b1.subtract(b2).doubleValue());  //-1.107
    
            //乘法
            System.out.println(b1.multiply(b2).doubleValue());  //2.888794
    
            //除法  保留小数点后两位,四舍五入
            System.out.println(b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP)); //0.53
        }
    }

    二、BigDecimal转String的时候出现的精度问题:

    有些两位类型的小数如double类型的,直接转化为String时,调用的是BigDecimal的toString方法,会出现精度问题。解决办法:

    package com.cy.test.math;
    
    import java.math.BigDecimal;
    
    public class TestBigDecimal3 {
    
        public static void main(String[] args) {
            BigDecimal b1 = new BigDecimal(1.23);
            BigDecimal b2 = new BigDecimal(1.24);
            BigDecimal b3 = new BigDecimal(1.25);
    
            System.out.println(b1);
            System.out.println(b2);
            System.out.println(b3);
    
            BigDecimal plus = b1.add(b2).add(b3);
            //直接打印会精度失真
            System.out.println(plus);
            System.out.println(String.valueOf(plus.floatValue()));
    
            //设置小数位数,第一个变量是小数位数,第二个变量是取舍方法(四舍五入)
            BigDecimal plus2 = b1.add(b2).add(b3).setScale(2, BigDecimal.ROUND_HALF_UP);
            System.out.println(plus2);
        }
    }

    打印结果:

    1.229999999999999982236431605997495353221893310546875
    1.2399999999999999911182158029987476766109466552734375
    1.25
    3.7199999999999999733546474089962430298328399658203125
    3.72
    3.72
  • 相关阅读:
    /、./和../的区别
    【Java基础】-- FileUtils工具类常用方法
    【数据库】-- MySQL中比like更高效的三个写法
    【Java框架】-- SpringBoot大文件RestTemplate下载解决方案
    记一次gitlab代码仓清空还原复盘
    聊聊如何实现一个带有拦截器功能的SPI
    聊聊如何实现一个支持键值对的SPI
    类实例对象的class类型却不属于该类,何解?
    exe打包成安装文件(界面美观)
    linux系统软件启动sh脚本
  • 原文地址:https://www.cnblogs.com/tenWood/p/11325247.html
Copyright © 2020-2023  润新知