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

相关推荐
星星在线9 分钟前
MusicFree:一个「All in One」的个人音乐服务器,让听歌回归简单
前端·后端
IT_陈寒1 小时前
Redis的SETNX并发问题让我加了三天班
前端·人工智能·后端
demo007x1 小时前
Docling 文档转换以及技术架构分析
前端·后端·程序员
NE_STOP3 小时前
Vide Coding--AI编程工具的选择
java
袋鱼不重3 小时前
我的神奇同事,AI 用多了居然写了个 Open In Codex
前端·后端·ai编程
用户8356290780513 小时前
使用 Python 操作 Word 内容控件
后端·python
像我这样帅的人丶你还3 小时前
啥? 前端也要会干Java?🛵🛵🛵
后端
Hommy883 小时前
【剪映小助手】添加贴纸接口(Add Sticker)
后端·github·剪映小助手·视频剪辑自动化·剪映api
码云数智-园园3 小时前
C++20 Modules 模块详解
java·开发语言·spring
程序员黑豆3 小时前
JDK 下载安装与配置详细教程
java·前端·ai编程