java浮点数精度问题及解决方案

我们直接看问题:

大家可以看到,输出结果并不是精确的0.3,而出现这种现象的根本原因就是:浮点数使用 IEEE 754 标准的二进制表示,IEEE 754标准定义的存储方式使部分十进制数无法获得精确二进制表达,像 0.1 这样的十进制小数在二进制中是无限循环小数(比如0.000110011...)(简单来说就是,由于计算机采用二进制系统,二进制的表示能力不足,许多十进制数无法精确表示为有限小数)。

所以,在Java中计算 0.1 + 0.2 的精确结果需要特殊处理,因为浮点数存在精度问题。

解决方案

1.使用BigDecimal

正确构造方式:

  • 字符串构造:new BigDecimal("0.1");
  • 静态方法:BigDecimal.valueOf(0.1);
  • 避免使用double构造方法:new BigDecimal(0.1); 这种方式一样会存在精度问题
java 复制代码
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
BigDecimal result = a.add(b); // 精确得0.3

总结

在金融计算领域,必须使用BigDecimal进行精确计算。

相关推荐
陈随易5 分钟前
副业搞钱点子之赛事与活动
前端·后端·程序员
古法老登瞎折腾10 分钟前
大数据智能运维实战(八):从调度任务追到计算引擎——补齐排查链路
java·大数据·运维·spring ai·mcp
砚底藏山河15 分钟前
python量化:实时行情WebSocket断线重连状态机
java·python·websocket·金融
衍生星球19 分钟前
【Java 语言】— 方法(方法定义、调用、参数、返回值、方法重载)
java·开发语言·方法
Profile排查笔记19 分钟前
有哪些开源指纹浏览器项目?先核对客户端、内核与许可证
前端·人工智能·后端·自动化
鶴哥只手遮天26 分钟前
雷达系统与成像仿真:从电磁散射到工程实现-第 1 章 雷达系统的分层架构与指标闭环
后端
喵了几个咪26 分钟前
GoWind UBA 拆解:把 Doris UNIQUE KEY 翻译成 ClickHouse——读数正确性对齐实录
开发语言·后端·clickhouse·微服务·golang·gowind
王中阳Go28 分钟前
面试官问什么,取决于你简历上写了什么:后端转 Agent 岗的项目准备法
后端·面试·agent
Wang's Blog37 分钟前
Java 项目实战: 交友项目 - 查询评论列表
java·交友