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进行精确计算。

相关推荐
身如柳絮随风扬2 小时前
Java中的CAS机制详解
java·开发语言
风筝在晴天搁浅4 小时前
hot100 78.子集
java·算法
故事和你914 小时前
sdut-Java面向对象-06 继承和多态、抽象类和接口(函数题:10-18题)
java·开发语言·算法·面向对象·基础语法·继承和多态·抽象类和接口
Configure-Handler5 小时前
buildroot System configuration
java·服务器·数据库
:Concerto5 小时前
JavaSE 注解
java·开发语言·sprint
电商API_180079052476 小时前
第三方淘宝商品详情 API 全维度调用指南:从技术对接到生产落地
java·大数据·前端·数据库·人工智能·网络爬虫
一点程序6 小时前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统
C雨后彩虹6 小时前
计算疫情扩散时间
java·数据结构·算法·华为·面试
2601_949809596 小时前
flutter_for_openharmony家庭相册app实战+我的Tab实现
java·javascript·flutter
vx_BS813307 小时前
【直接可用源码免费送】计算机毕业设计精选项目03574基于Python的网上商城管理系统设计与实现:Java/PHP/Python/C#小程序、单片机、成品+文档源码支持定制
java·python·课程设计