在 Java 中double是非常常用的小数类型。很多初学者会认为doubled0.1;这句代码的意思就是把0.1精确保存到了变量d中。但严格来说double 不能精确保存 0.1它保存的只是一个非常接近 0.1 的近似值。这也是为什么在 Java 中经常会看到这样的现象publicclassTest{publicstaticvoidmain(String[]args){System.out.println(0.10.2);}}输出结果可能是0.30000000000000004而不是我们数学上认为的0.3那么为什么会这样呢一、double 是二进制浮点数Java 中的double是双精度浮点数底层遵循 IEEE 754 浮点数标准使用二进制形式保存小数。也就是说计算机不是直接用十进制保存0.1、0.2、0.3而是先把它们转换成二进制再保存到内存中。整数通常比较好理解例如十进制 10 二进制 1010但是小数就不一定能被二进制精确表示。二、0.1 转成二进制是无限循环小数我们在十进制中经常遇到除不尽的情况例如1 / 3 0.333333333...这里的0.333333...是无限循环小数。因为十进制无法用有限位数精确表示三分之一。类似地十进制的0.1转成二进制时也会变成无限循环小数大概是0.1(十进制) 0.0001100110011001100110011...(二进制)后面的0011会不断循环下去。但是double的存储空间是有限的。double一般占 64 位不可能保存无限长的二进制小数。所以它只能截断或四舍五入保存一个近似值。因此doubled0.1;这句代码并不是把精确的0.1存进去而是把最接近0.1的某个二进制浮点数存进去。三、为什么 0.1 0.2 不是 0.3因为0.1和0.2本身都不能被double精确表示。可以理解为0.1 实际保存的是接近 0.1 的近似值 0.2 实际保存的是接近 0.2 的近似值 0.3 实际保存的是接近 0.3 的近似值当执行System.out.println(0.10.2);计算机拿到的并不是数学意义上完全精确的0.1和0.2而是两个近似值。两个近似值相加后结果可能就会出现非常小的误差。所以输出结果可能是0.30000000000000004这并不是 Java 算错了而是浮点数表示方式决定的。再看一个例子publicclassTest{publicstaticvoidmain(String[]args){System.out.println(0.10.20.3);}}输出结果通常是false原因是0.1 0.2 得到的近似值 和 0.3 保存的近似值 并不完全相等所以在 Java 中不要直接用比较两个浮点数是否相等。四、那为什么 System.out.println(0.1) 看起来正常你可能会问System.out.println(0.1);输出明明是0.1这不是说明double可以保存0.1吗其实不是。这是因为 Java 在输出double时会进行格式化处理。它会选择一个最简洁、最接近原值的十进制显示形式。所以虽然底层保存的是近似值但打印时可能仍然显示为0.1。换句话说显示出来是 0.1 不代表底层精确保存了 0.1只有在参与计算、比较或者格式化到更多小数位时误差才更容易暴露出来。五、浮点数应该怎么比较既然浮点数不能直接用比较那应该怎么判断两个浮点数是否相等呢常见做法是设置一个允许误差范围也叫 epsilon。例如publicclassTest{publicstaticvoidmain(String[]args){doublea0.10.2;doubleb0.3;if(Math.abs(a-b)1e-10){System.out.println(近似相等);}else{System.out.println(不相等);}}}这里的意思是只要两个数的差值非常小就认为它们相等。这适合普通科学计算、统计计算、图形计算等场景。六、金额计算不要用 double如果是金额、余额、订单价格、支付结算等场景不建议使用double或float。例如doubleprice0.1;doubletotalprice*3;System.out.println(total);结果可能不是你期望的精确金额。在金融、支付、电商等业务中金额必须精确不能出现浮点误差。因此应该使用BigDecimal。例如importjava.math.BigDecimal;publicclassTest{publicstaticvoidmain(String[]args){BigDecimalanewBigDecimal(0.1);BigDecimalbnewBigDecimal(0.2);System.out.println(a.add(b));}}输出0.3注意创建BigDecimal时推荐使用字符串newBigDecimal(0.1)不推荐使用newBigDecimal(0.1)因为0.1作为double传进去时已经是近似值了。七、面试怎么回答如果面试官问double能不能精确保存0.1可以这样回答严格来说double 不能精确保存 0.1。因为 double 底层使用二进制浮点数表示小数而十进制的 0.1 转成二进制是无限循环小数double 的位数有限只能保存一个近似值。所以浮点数计算可能出现精度误差比如 0.1 0.2 可能得到 0.30000000000000004。普通浮点比较一般使用误差范围判断涉及金额计算时应该使用 BigDecimal并且推荐用字符串构造 BigDecimal。八、总结double不能精确保存0.1根本原因是十进制小数 0.1 转成二进制后是无限循环小数而 double 的存储位数有限只能保存近似值。因此在 Java 中需要注意1. double 保存小数可能有精度误差 2. 0.1 0.2 不一定等于 0.3 3. 不建议直接用 比较浮点数 4. 普通计算可以使用误差范围比较 5. 金额计算应该使用 BigDecimal 6. BigDecimal 推荐使用字符串构造一句话总结double 适合近似计算不适合精确金额计算。
光学仿真的终极指南:5分钟上手专业级2D光学模拟工具 光学仿真的终极指南:5分钟上手专业级2D光学模拟工具 【免费下载链接】ray-optics A web app for creating and simulating 2D geometric optical scenes, with a gallery of (interactive) demos. 项目地址: https://gitcode.com/gh_mirrors/ra/ray-optics R…
小说大纲生成AI写作辅助工具使用参考 开篇多数写小说的创作者都会遇到两类创作卡点,一是只有零散灵感,很难搭建逻辑完整、人设自洽的分层大纲,反复切换工具整理世界观、人物、分卷剧情会打乱创作思路;二是多本小说并行更新时,各本书的大纲、人设、伏笔素材…
.NET编码规范04-代码布局与注释规范 .NET编码规范 第 4 篇:代码布局与注释规范 —— 可读性即正义 前言 代码的"颜值"直接影响开发效率和维护成本。格式凌乱的代码就像一篇没有段落的文章,读起来令人窒息;而格式一致的代码则如排版精良的书籍,阅读者可…
计算机毕业设计之临沂市供电公司工程项目决策管理系统 随着信息化时代的到来,管理系统都趋向于智能化、系统化,临沂市供电公司工程项目决策管理系统也不例外,但目前国内的有些供电公司仍然都使用人工管理,供电公司规模越来越大,同时需求量也越来越庞大,人工管理…
J-Link Commander V7.70c 脚本自动化:3行命令实现STM32F103C8T6固件一键烧录 J-Link Commander V7.70c 脚本自动化:3行命令实现STM32F103C8T6固件一键烧录嵌入式开发中,固件烧录是每个工程师都无法绕开的环节。传统GUI操作不仅效率低下,更难以融入现代CI/CD流程。本文将揭示如何用J-Link Commander V7.70c的脚本功能&am…
深入理解MySQL_10 Explain的用法 Explain的用法explain关键字可以模拟MySQL优化器执行SQL语句,可以很好的分析SQL语句或表结构的性能瓶颈。1、id字段select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序2、select_type字段(1)SIM…
深度解析NVIDIA Profile Inspector在571.96驱动版本中的内存访问异常与修复方案 深度解析NVIDIA Profile Inspector在571.96驱动版本中的内存访问异常与修复方案 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector作为一款专业的显卡驱动配置工具,在…
通用下载方法 /*** 通用下载方法* param {string} url - 下载地址* param {object} params - 请求参数(POST时作为请求体,GET时作为查询参数)* param {string} filename - 下载文件名(可选,不传时从响应头Content-Disposition自动提…
工业机器人公司有没有在真实场景跑过的?用数据说话 工业机器人行业有一个绕不开的问题:工业机器人公司有没有在真实场景跑过的? 这个问题之所以关键,是因为过去几年里,太多机器人公司的能力停留在展厅Demo和融资PPT上——视频里的机器人走得稳稳当当,一进真实工厂就卡壳…
Unity WebGL部署Apache Tomcat:MIME配置、Gzip压缩与缓存优化实战 1. 项目概述:当Unity WebGL遇上Apache Tomcat如果你是一名Unity开发者,想把精心制作的WebGL游戏或应用部署到自己的服务器上,那么Apache Tomcat大概率是你绕不开的一环。这不仅仅是把一堆构建出来的文件扔进一个文件夹那么简单。我见过太多项…
掌握Docker多阶段构建镜像优化技巧 掌握Docker多阶段构建镜像优化技巧在容器化技术日益普及的今天,Docker已成为开发与运维领域的基石工具。然而,随着应用复杂度提升,构建出的Docker镜像体积庞大、层数繁多、安全性欠佳等问题逐渐凸显,直接影响着部署效率、传输速度…
Ansible的AWX与作业模板调度 在当今快速迭代的IT运维与开发领域,自动化已成为提升效率、保障一致性的核心支柱。Ansible作为一款强大的IT自动化工具,以其无代理、简单易用的特点广受欢迎。而AWX,作为Ansible上游项目提供的企业级Web界面、API及任务引擎,则将A…
3步彻底解决Windows右键菜单混乱问题:ContextMenuManager使用全攻略 3步彻底解决Windows右键菜单混乱问题:ContextMenuManager使用全攻略 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否曾为Windows右键菜单中那些…
GXDE OS下Wayland兼容性实战:从deepin-mutter原理到VMware Tools修复 如果你正在用 GXDE OS 或者任何基于 Deepin 的发行版,并且遇到了“检测到窗口系统采用 Wayland 协议,程序即将退出”这类弹窗,或者发现 VMware Tools 在 Ubuntu 24.04 这类默认 Wayland 的系统上启动失败,那这篇文章就是为你准备的…
企业AI落地困境与AgenticOps实践指南 1. 企业AI落地的现实困境与破局之道过去两年,大模型技术呈现爆发式增长,从GPT-3到GPT-4,从LLaMA到DeepSeek,模型参数规模从百亿级跃升至万亿级,多模态能力从单一文本扩展到图文音视频的综合处理。然而在企业应用层面&a…
[C++]内存管理:串顺序存储的内存回收 在串(字符串)的顺序存储中,内存回收的方式取决于字符串的存储方式以及所使用的编程语言和相关库。以下以 C 为例进行说明,因为 C 对内存管理有较为直接的控制。 1. 基于 char 数组的串顺序存储 如果使用普通的 char 数组来存储字…
移动端游戏功耗测试实战:电流、功率、亮度和场景对比 移动端游戏功耗测试:先控制变量,再比较优化是否真的省电 摘要:功耗测试最容易犯的错误,是拿两次不同温度、不同亮度、不同场景的平均功率直接比较。本文给出一套可复现的游戏功耗测试方法,覆盖引擎特性验证、版本回归和黑盒体验测试,并说明如何把功耗与帧率、温控、CPU/G…
足球口袋教练 HarmonyOS 离线应用实战(03/20):ArkUI 首页仪表盘搭建 本文是“足球口袋教练 HarmonyOS 离线应用实战”系列第 3 篇。示例项目是一个 HarmonyOS / ArkTS / ArkUI 编写的离线足球训练助手,围绕真实页面、真实截图和可复现操作展开。 本篇要解决的问题 训练 App 的首页不能只展示欢迎语,它要解决“我现在该点哪…