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

相关推荐
karry_k2 小时前
混合存储架构
后端
yunxi_052 小时前
我用 Elasticsearch 做 RAG 检索的一些“土经验”
后端·llm
JaguarJack2 小时前
PHP 8.2 vs PHP 8.3 对比:新功能、性能提升和迁移技巧
后端·php
学历真的很重要2 小时前
Claude Code 万字斜杠命令指南
后端·语言模型·面试·职场和发展·golang·ai编程
花心蝴蝶.2 小时前
Java 中的代理模式
java·开发语言·代理模式
舒克起飞了2 小时前
设计模式——单例模式
java·单例模式·设计模式
Java&Develop3 小时前
GitLab-如何基于现有项目仓库,复制出新的项目仓库
java
一只乔哇噻3 小时前
java后端工程师进修ing(研一版‖day49)
java·开发语言
稻草猫.3 小时前
Java线程安全:volatile与wait/notify详解
java·后端·idea