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

点击查看代码
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  ==========");
    }
}

posted @   liangkuan  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
点击右上角即可分享
微信分享提示