讲师中心 微信公众号
AI工具推荐 视频效率加速

Java 浮点型精度丢失问题分析及 Double 存储原理指南

冬晨酱_5561

冬晨酱_5561

发布时间:2026-07-02 13:28:08

|

898人浏览过

|

来源于php中文网

原创

Java中double无法精确表示0.1,根本原因是0.1在二进制中为无限循环小数(0.000110011…₂),而IEEE 754双精度仅提供52位尾数,必须截断舍入,导致存储值为近似值,后续所有运算均在此误差基础上展开。

java 浮点型精度丢失问题分析及 double 存储原理指南

Java 中的 double 类型精度丢失,不是程序写错了,而是计算机用二进制表示十进制小数时“力不从心”造成的必然现象。它不只影响 0.1 + 0.2 ≠ 0.3 这种简单计算,更会在金融、计费、科学累加等场景引发隐蔽但严重的误差。

Double 为什么存不准 0.1?

根本原因在于:十进制小数 0.1 在二进制中是无限循环小数(就像十进制里 1÷3 = 0.333…),而 double 只有 52 位尾数空间,必须截断并四舍五入。这个近似值被存进内存后,所有后续运算都基于它展开,误差就此埋下。

  • double 遵循 IEEE 754 标准:1 位符号 + 11 位指数 + 52 位尾数
  • 能精确表示的十进制小数非常有限——仅那些分母是 2 的幂次的数,比如 0.5(1/2)、0.25(1/4)、0.125(1/8)
  • 像 0.1、0.2、0.3、0.7 这类常见小数,全部无法精确存储

哪些操作会暴露精度问题?

不只是加减法,任何依赖浮点中间结果的逻辑都可能出错:

Java Maven Code Review
Java Maven Code Review

审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。

下载
  • 相等判断:if (a == b) 对 double 几乎总是不可靠,应改用 Math.abs(a - b) < 1e-10
  • 循环控制:for (double x = 0.0; x < 1.0; x += 0.1) 可能多跑一次或少跑一次
  • 金额累加:0.01 元反复加 100 次,结果可能不是 1.00 元,而是 0.9999999999999999
  • 科学计算:大量小步长迭代(如数值积分)会让误差逐步放大

真正管用的解决方法

没有“万能方案”,关键看业务是否要求绝对精确:

立即学习“Java免费学习笔记(深入)”;

  • 金额类场景(必须精确):统一用整数单位(如“分”)存储,类型选 long;或直接使用 BigDecimal,构造时用字符串(new BigDecimal("0.1")),避免 double 构造器传入已失真的值
  • 需要高精度但非金融:BigDecimal 同样适用,注意 setScale() 控制小数位与舍入模式(如 RoundingMode.HALF_UP)
  • 允许误差的场景:图形渲染、传感器原始数据、机器学习权重——float/double 性能好且误差远小于噪声本身,可放心用

Double 存储原理一句话说清

double 把一个数拆成三部分存:符号位(正负)、指数(决定大小量级)、尾数(决定有效数字)。它本质是用二进制科学计数法表示数字,所以能表示极大极小的数,但牺牲了对多数十进制小数的精确表达能力——这不是 bug,是二进制与人类十进制习惯之间的天然鸿沟。

热门AI工具

更多
Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

9897

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

7042

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

6212

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1064

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

888

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

1296

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2589

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

19931

2023.08.03

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

100

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn