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

相关推荐
漫霂3 分钟前
二叉树的翻转
java·数据结构·算法
语戚3 分钟前
力扣 51. N 皇后:基础回溯、布尔数组优化、位运算全解(Java 实现)
java·算法·leetcode·力扣·剪枝·回溯·位运算
程序猿阿越14 分钟前
Kafka4源码(三)Share Group共享组
java·后端·源码阅读
亦暖筑序15 分钟前
让AI不再"一本正经胡说八道":Spring AI RAG与VectorStore源码全解
java·源码阅读
蒙奇·D·路飞-19 分钟前
大模型时代下 Java 后端开发的技术重构与工程实践
java·开发语言·重构
ZK_H1 小时前
半导体工艺流程
java·c语言·开发语言·计算机网络·金融
Crazy________1 小时前
4.10dockerfile构建镜像
java·开发语言
阿维的博客日记1 小时前
锁消除和锁粗化
java·逃逸分析
云烟成雨TD1 小时前
Spring AI 1.x 系列【26】结构化输出执行流程
java·人工智能·spring
Slow菜鸟1 小时前
Spring Cloud 教程(四) | OpenFeign 的作用
后端·spring·spring cloud