当前位置: 首页 > article >正文

别再让0.1+0.2不等于0.3了!Java中BigDecimal的正确使用姿势与避坑指南

别再让0.10.2不等于0.3了Java中BigDecimal的正确使用姿势与避坑指南金融系统凌晨告警用户余额凭空消失0.01元。排查发现某笔利息计算采用double类型累加本应输出100.35元的结果却显示为100.34999999999999。这个看似微小的误差最终导致公司单日损失超2万元——这正是不当使用浮点数引发的经典事故现场。1. 为什么0.10.2≠0.3浮点数的精度陷阱计算机用二进制浮点数表示小数时类似用1/2、1/4、1/8等分数组合来逼近十进制小数。就像用乐高积木拼出圆形无论如何组合都存在缝隙System.out.println(0.1 0.2); // 输出0.30000000000000004 System.out.println(1.03 - 0.42); // 输出0.6100000000000001根本原因在于浮点数遵循IEEE 754标准由符号位、指数位和尾数位组成像0.1这样的十进制数在二进制中是无限循环小数类似1/30.333...存储时必然发生截断导致精度丢失金融、电商等涉及资金的系统必须禁用double/float误差累积可能引发法律纠纷2. BigDecimal的生死局初始化就是分水岭同样的数字不同的构造方式会导致完全不同的结果// 错误示范直接传入double BigDecimal d1 new BigDecimal(0.1); System.out.println(d1); // 0.100000000000000005551115123125... // 正确姿势字符串构造 BigDecimal d2 new BigDecimal(0.1); System.out.println(d2); // 精确输出0.1初始化方案对比构造方式精度保证推荐指数典型场景new BigDecimal(double)❌⭐绝对避免使用new BigDecimal(String)✅⭐⭐⭐⭐⭐金额、利率等计算BigDecimal.valueOf(double)✅⭐⭐⭐⭐临时转换已有变量特殊技巧若必须处理double类型输入先用Double.toString()转换BigDecimal safe new BigDecimal(Double.toString(0.1));3. 运算中的暗礁除法的九死一生当两个BigDecimal相除可能产生无限小数时必须明确指定舍入模式否则抛出ArithmeticExceptionBigDecimal a new BigDecimal(10); BigDecimal b new BigDecimal(3); // 危险操作未指定舍入模式 // a.divide(b); // 抛出异常 // 安全做法指定精度和舍入规则 BigDecimal result a.divide(b, 4, RoundingMode.HALF_UP); System.out.println(result); // 输出3.3333八大舍入模式实战指南RoundingMode.UP零方向舍入1.111→1.12总是进位RoundingMode.DOWN零方向截断1.119→1.11直接舍弃RoundingMode.HALF_UP四舍五入1.115→1.121.114→1.11RoundingMode.HALF_EVEN银行家舍入1.125→1.12偶舍奇入税务计算通常要求HALF_UP而科学计算推荐HALF_EVEN减少累计误差4. 性能与线程安全的双刃剑虽然BigDecimal是线程安全的但不当使用仍会导致性能问题典型陷阱// 错误循环内重复创建对象 for (int i 0; i 10000; i) { BigDecimal temp new BigDecimal(i).multiply(rate); // ... } // 优化复用不可变对象 BigDecimal rate new BigDecimal(0.05); BigDecimal sum BigDecimal.ZERO; for (int i 0; i 10000; i) { sum sum.add(new BigDecimal(i).multiply(rate)); }性能优化技巧预定义常用常量BigDecimal.ZERO/ONE/TEN复杂运算使用MathContext指定精度上下文批量运算时考虑使用stripTrailingZeros()去除多余零5. 实战避坑清单从血泪史中总结的黄金法则构造禁区永远不要用new BigDecimal(0.1)金额字段在DTO中直接定义为String类型等值比较的玄机// 错误使用equals比较会同时校验值和scale new BigDecimal(2.0).equals(new BigDecimal(2)); // false // 正确使用compareTo new BigDecimal(2.0).compareTo(new BigDecimal(2)) 0; // true序列化陷阱JSON序列化时Fastjson默认将BigDecimal转为String避免精度丢失使用JsonFormat(shapeSTRING)注解强制输出字符串格式数据库映射规范-- 推荐使用DECIMAL(19,4)对应金额字段 CREATE TABLE account ( balance DECIMAL(19,4) NOT NULL COMMENT 金额 );科学计数法应对// 避免输出1E7这样的格式 bigDecimal.setScale(2).toPlainString();某电商平台在促销活动期间因未设置BigDecimal的scale导致折扣计算出现1.0000000001折的显示问题引发大量客诉。后来团队在代码审查清单中加入以下条款所有金额计算必须显式设置scale除法运算必须捕获ArithmeticException所有BigDecimal字段必须添加Digits注解校验位数

相关文章:

别再让0.1+0.2不等于0.3了!Java中BigDecimal的正确使用姿势与避坑指南

别再让0.10.2不等于0.3了!Java中BigDecimal的正确使用姿势与避坑指南 金融系统凌晨告警:用户余额凭空消失0.01元。排查发现,某笔利息计算采用double类型累加,本应输出100.35元的结果却显示为100.34999999999999。这个看似微小的误…...

如何使用AutoTrain Advanced进行图像超分辨率训练:真实与合成低分辨率图像对比指南

如何使用AutoTrain Advanced进行图像超分辨率训练:真实与合成低分辨率图像对比指南 【免费下载链接】autotrain-advanced 🤗 AutoTrain Advanced 项目地址: https://gitcode.com/gh_mirrors/au/autotrain-advanced AutoTrain Advanced是一款强大的…...

生成式AI应用标准SITS2026深度拆解(2026年唯一国家级AI治理准绳)

第一章:SITS2026发布:生成式AI应用标准 2026奇点智能技术大会(https://ml-summit.org) SITS2026(Standard for Intelligent Text & Synthesis Applications, 2026 Edition)是首个面向生产级生成式AI系统落地的跨模态应用标准…...

精益管理模式实战应用:精益管理模式如何解决多品种小批量生产的交付难题

在当前制造业从“少品种大批量”向“多品种小批量”急剧转型的背景下,生产计划混乱、换线频繁、库存积压等问题频发,导致企业深陷交付难题的泥潭。面对这一挑战,精益管理模式提供了一套行之有效的系统化方法。本文将深入拆解精益管理模式的核…...

OpenAudio 插件开发指南:从零开始构建你的第一个 VST 插件

OpenAudio 插件开发指南:从零开始构建你的第一个 VST 插件 【免费下载链接】OpenAudio A list of open source audio software projects (Apps, Plugins and Libraries). Please contribute more links or open source your own plugins. 项目地址: https://gitco…...

仅限头部科技公司使用的生成式AI服务治理沙箱环境:支持Prompt血缘追踪、模型版本回滚、推理链路水印(申请通道即将关闭)

第一章:生成式AI应用服务治理方案 2026奇点智能技术大会(https://ml-summit.org) 随着大语言模型与多模态生成式AI在企业级场景的规模化落地,服务治理已从传统API生命周期管理演进为涵盖模型调用、内容安全、成本追踪、合规审计与反馈闭环的复合型工程…...

告别HTTP/2?手把手教你用lsquic在C语言项目中实现QUIC客户端(附完整回调函数指南)

从HTTP/2到QUIC:用lsquic构建高性能C语言客户端的实战指南 当你的服务器还在用HTTP/2处理请求时,世界已经悄然进入了QUIC时代。作为Google主导开发的新一代传输协议,QUIC在TCPTLSHTTP/2组合的基础上,通过UDP实现了更快的连接建立、…...

magentic并行函数调用高级教程:同时执行多个AI操作的秘密武器

magentic并行函数调用高级教程:同时执行多个AI操作的秘密武器 【免费下载链接】magentic Seamlessly integrate LLMs as Python functions 项目地址: https://gitcode.com/gh_mirrors/ma/magentic 在当今AI应用开发中,效率是关键。magentic作为一…...

Submillisecond 终极指南:构建高性能 Rust Web 应用的快速教程

Submillisecond 终极指南:构建高性能 Rust Web 应用的快速教程 【免费下载链接】submillisecond A lunatic web framework 项目地址: https://gitcode.com/gh_mirrors/su/submillisecond Submillisecond 是一个基于 Rust 语言、WebAssembly 安全性和 lunatic…...

如何免费无限使用Cursor Pro:终极指南与机器ID重置教程

如何免费无限使用Cursor Pro:终极指南与机器ID重置教程 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your tr…...

贡献指南:如何参与py-xiaozhi开源项目,成为AI助手开发大神

贡献指南:如何参与py-xiaozhi开源项目,成为AI助手开发大神 【免费下载链接】py-xiaozhi 基于Python的Xiaozhi AI,适用于想要完整Xiaozhi体验而无需拥有专用硬件的用户。 项目地址: https://gitcode.com/huangjunsen0406/py-xiaozhi py…...

Doppler实战教程:10个创意应用场景与代码示例

Doppler实战教程:10个创意应用场景与代码示例 【免费下载链接】doppler :wave: Motion detection using the doppler effect 项目地址: https://gitcode.com/gh_mirrors/do/doppler Doppler是一款基于多普勒效应的Web端运动检测工具,通过普通麦克…...

悟空CRM数据迁移与升级:安全高效的版本更新策略

悟空CRM数据迁移与升级:安全高效的版本更新策略 【免费下载链接】WukongCRM-11.0-JAVA 悟空CRM-基于Spring Cloud Alibaba微服务架构 vue ElementUI的前后端分离CRM系统 项目地址: https://gitcode.com/gh_mirrors/wu/WukongCRM-11.0-JAVA 悟空CRM是基于Spri…...

10:机台常用传感器与执行器(EAP现场必认)

10:机台常用传感器与执行器(EAP现场必认) 一、本课学习目标 认识机台常用传感器,知道安装位置与检测对象分清执行器功能及与PLC、EAP的对应关系明确机台状态对应的传感器来源初步判断机台异常是传感器问题还是执行器问题二、传感器…...

9:PLC基础(EAP必懂底层逻辑)

第9课:PLC基础(EAP必懂底层逻辑) 一、本课学习目标 明白PLC是什么,在机台里起什么作用看懂机台逻辑为什么是“条件满足→才动作”认识 DI/DO/AI/AO 这四个EAP天天见的信号建立“机台为什么会自己动、自己停”的基本认知二、PLC 是…...

RootMyTV完整教程:10步轻松root你的LG电视

RootMyTV完整教程:10步轻松root你的LG电视 【免费下载链接】RootMyTV.github.io RootMyTV is a user-friendly exploit for rooting/jailbreaking LG webOS smart TVs. 项目地址: https://gitcode.com/gh_mirrors/ro/RootMyTV.github.io RootMyTV是一款用户友…...

ADS射频IC设计实战:从工艺文件到精准衬底建模

1. 射频IC设计中的衬底建模为何如此重要? 第一次接触射频集成电路设计时,我也曾疑惑:为什么要在仿真前花这么多精力折腾衬底建模?直到某次项目吃了大亏才明白——这就像盖房子不打地基,表面看着光鲜,实际一…...

广度优先搜索(Breadth-First Search, BFS)是一种基于队列的图遍历算法,因其逐层探索的特性,在解决最短路径问题(特别是无权图或权值相同的图)时具有天然优势

广度优先搜索(Breadth-First Search, BFS)是一种基于队列的图遍历算法,因其逐层探索的特性,在解决最短路径问题(特别是无权图或权值相同的图)时具有天然优势。 本文将深度剖析如何用 BFS 解决最短路径问题,涵盖核心思想、算法步骤、代码实现、适用场景、优化技巧及常见…...

最长回文子序列(Longest Palindromic Subsequence, LPS)问题是一个经典的动态规划问题,目标是给定一个字符串,找出其最长的子序列,使得该子序列是回文的(即正读反读相同)

最长回文子序列(Longest Palindromic Subsequence, LPS)问题是一个经典的动态规划问题,目标是给定一个字符串,找出其最长的子序列,使得该子序列是回文的(即正读反读相同)。 以下是对该问题的深度剖析,包括问题定义、动态规划解法、代码实现及优化技巧。 一、问题定义 …...

Blade Icons与第三方图标包集成:Heroicons、Font Awesome等实战指南

Blade Icons与第三方图标包集成:Heroicons、Font Awesome等实战指南 【免费下载链接】blade-icons A package to easily make use of SVG icons in your Laravel Blade views. 项目地址: https://gitcode.com/gh_mirrors/bl/blade-icons Blade Icons是一款专…...

从零到一:掌握LVGL圆弧(Arc)部件的核心绘制与样式定制

1. 初识LVGL圆弧部件:从CSS盒子模型说起 第一次接触LVGL的圆弧(Arc)部件时,我完全被它灵活的样式配置搞懵了。直到发现它借鉴了CSS盒子模型的设计思想,才恍然大悟。想象一下,圆弧部件就像一个俄罗斯套娃,由多层结构组成…...

远程工作社交隔离:软件测试从业者的心理健康危机与应对策略

在数字化的浪潮下,远程工作模式已成为软件测试行业的普遍选择。这种工作方式为测试工程师带来了前所未有的灵活性,允许他们在更舒适的环境中规划工作,并节省了通勤时间与成本。然而,这道物理屏幕在提供便利的同时,也悄…...

开源商业化困境:道德与利益平衡

测试工程师的双重角色与时代拷问在日常工作中,从自动化测试框架Selenium、性能压测工具JMeter,到持续集成工具Jenkins,软件测试从业者的工具链与工作流,早已深深嵌入开源软件的生态之中。这些免费、高效的工具,极大地提…...

如何使用Unlock Music解密工具:完整音乐格式转换解决方案

如何使用Unlock Music解密工具:完整音乐格式转换解决方案 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: ht…...

基于ZigBee的家庭监护系统(有完整资料)

资料查找方式:特纳斯电子(电子校园网):搜索下面编号即可编号:T1122305M设计简介:本设计是基于STM32的家庭监护系统,主要实现以下功能:1.主机与从机采用Zigbee进行通信 2.可通过MQ-2采…...

2026年AI Coding爆发!程序员必藏:收藏这份升级为AI价值创造者的核心策略

随着AI Coding的全面爆发,程序员需从“写代码的执行者”升级为“驾驭AI的价值创造者”。文章提出人机协同、垂直深耕、架构跃迁、能力复合四条主线,帮助程序员规划职业,构建AI无法替代的核心壁垒。核心内容涵盖AI如何重塑职业格局、四大主流职…...

【交换机配置-基本配置】

交换机配置-基本配置 1.交换机上要配置console接口的口令,需使用:user-interface console 0 先进入console接口。 2.交换机命令 system 的作用是:进入系统视图。 3.查看odpf接口的开销、状态、类型、优先级等的命令是:display osp…...

Vue3富文本编辑器安全实践:Tiptap与Quill的XSS防御机制对比

1. 为什么富文本编辑器的XSS防御如此重要 富文本编辑器是现代Web应用中不可或缺的组件,它让用户可以像使用Word一样自由地排版内容。但正是这种"自由"带来了安全隐患——用户可能无意或故意输入包含恶意脚本的内容。想象一下,如果你的博客平台…...

基于vue的图书借阅信息管理系统[vue]-计算机毕业设计源码+LW文档

摘要:本文阐述了一个基于Vue框架的图书借阅信息管理系统的设计与实现过程。系统旨在解决传统图书管理方式效率低下、信息更新不及时等问题,采用前后端分离的架构模式,前端使用Vue相关技术构建用户界面,后端提供数据支持。通过对系…...

浏览器全屏模式隐藏技巧:用CSS伪类打造沉浸式Web游戏界面

浏览器全屏模式隐藏技巧:用CSS伪类打造沉浸式Web游戏界面 当玩家沉浸在Web游戏的世界中时,任何干扰元素都可能破坏体验。全屏模式下的浏览器默认UI、意外触发的ESC键退出,或是分辨率适配问题,都可能让精心设计的游戏界面功亏一篑。…...