浮点型计算、四舍五入问题

发布时间 2023-07-18 14:12:00作者: liangkuan
点击查看代码
package com.bh.bugs;

import java.math.BigDecimal;
import java.math.RoundingMode;

public class Test1 {
    public static void main(String[] args) {
        System.out.println("start==========");
        // java中, double在计算的时候,精度丢失问题

        // 1, 问题再现
        // 不仅仅是java语言, 包括js, 在计算浮点类型的时候
        // 出现了精度丢失
        double d1 = 1;
        double d2 = 0.99;
//        System.out.println(d1 - d2);

        // 2, 问题分析
        // 问题很简单, 计算机底层是二进制的,任何计算都会转换成二进制
        // 然后进行计算, 计算结果会再次转换成相应的类型
        // 这个时候,精度就丢失了

        // 3, 问题解决
        // 在java中,任何关于浮点类型的计算, 一定要使用BigDecimal这个类
        // 如果你的项目是, 银行,商城,保险,金融,电信等,一定要使用BigDecmial

        //BigDecimal演示
        BigDecimal big1 = new BigDecimal("1");
        BigDecimal big2 = new BigDecimal("0.99");
        BigDecimal rst = big1.subtract(big2);
        double d3 = rst.doubleValue();
//        System.out.println(d3);

        // 保留两位小数点, 经典的四舍五入
        BigDecimal rst2 = rst.setScale(2, RoundingMode.HALF_UP);
//        System.out.println(rst2);

        BigDecimal big3 = new BigDecimal("11.545");
        // 银行家舍入方法
        // 银行家舍入
        // https://baike.baidu.com/item/%E9%93%B6%E8%A1%8C%E5%AE%B6%E8%88%8D%E5%85%A5/4781630?fr=aladdin
        BigDecimal rst3 = big3.setScale(2,RoundingMode.HALF_EVEN);
        System.out.println(rst3);

        System.out.println("end  ==========");
    }
}