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

相关推荐
巴拉巴拉~~10 小时前
KMP 算法通用步进器组件:KmpStepperWidget 横向 / 纵向 + 匹配进度 + 全样式自定义
java·服务器·开发语言
贺今宵10 小时前
使用idea启动一个springboot项目
java·ide·intellij-idea
shiwulou110 小时前
PbRL | 近两年论文阅读的不完全总结
后端
伍一5110 小时前
芋道框架下的进销存升级(三):Yudao-ERP2异步导出/导入Excel的设计与实现
java·excel·异步导出excel
胡闹5410 小时前
【EasyExcel】字段赋值错乱问题
java·开发语言
yuniko-n10 小时前
【MySQL】通俗易懂的 MVCC 与事务
数据库·后端·sql·mysql
断剑zou天涯10 小时前
【算法笔记】AC自动机
java·笔记·算法
张工摆Bug10 小时前
《别再写满屏的if-else了!Spring Boot + 策略模式实战优化》
java
独自归家的兔10 小时前
基于GUI-PLUS 搭配 Java Robot 实现智能桌面操控
java·开发语言·人工智能
用户37215742613510 小时前
Python 实现 PDF 文档压缩:完整指南
java