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

相关推荐
码农的小菜园7 分钟前
Java线程池学习笔记
java·笔记·学习
清汤饺子11 分钟前
搞懂 Cursor 后,我一行代码都不敲了《实战篇》
前端·javascript·后端
hongtianzai20 分钟前
Laravel8.x核心特性全解析
java·c语言·开发语言·golang·php
AntBlack22 分钟前
Ant-Browser : 发布一个开源免费的指纹浏览器 ,欢迎体验
后端·架构·go
逸Y 仙X24 分钟前
文章十一:ElasticSearch Dynamic Template详解
java·大数据·数据库·elasticsearch·搜索引擎·全文检索
隔壁小邓26 分钟前
IDEA 中同时启动多个微服务
java·微服务·intellij-idea
:12126 分钟前
idea17创建tomcat项目(计网底层核心理解!)
java·ide·intellij-idea
楼田莉子27 分钟前
C++高性能并发内存池:三种Cache的设计及其内存申请释放
c++·后端·链表·哈希算法·visual studio
Brookty29 分钟前
网络通信核心:四元组、socket与IO机制详解
java·网络通信·网络入门
短剑重铸之日35 分钟前
《ShardingSphere解读》12 解析引擎:SQL 解析流程应该包括哪些核心阶段?(下)
数据库·后端·sql·架构·shardingsphere·分库分表