java浮点数精度问题及解决方案
作者:互联网
2025-09-27
我们直接看问题:
大家可以看到,输出结果并不是精确的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); 这种方式一样会存在精度问题
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
BigDecimal result = a.add(b); // 精确得0.3
总结
在金融计算领域,必须使用BigDecimal进行精确计算。
相关推荐
专题
+ 收藏
+ 收藏
+ 收藏
+ 收藏
+ 收藏
+ 收藏
最新数据
相关文章
【从0到1构建一个ClaudeAgent】并发-后台任务
04/17
MyBatis、MyBatis-Plus、JPA、MyBatisGX 写法比较:同一个需求,四种解法
04/17
java2AI系列:SpringAI 通过 Function Calling 接入外部系统
04/17
Java 通用树形结构构建与解析工具类解析
04/17
深度剖析:Java 并发三大量难题 —— 死锁、活锁、饥饿全解
04/17
别再重复造轮子了!SpringBoot对接第三方系统模板,拿来即用
04/17
Spring AI 核心原理解析:基于 1.1.4 版本拆解底层架构
04/16
华为 IODT 设备接入
04/16
自定义跨字段校验必填注解
04/16
别再System.out了!这份SpringBoot日志优雅指南,让你告别日志混乱
04/16
AI精选
