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

从数据库设计到前端展示:一条龙搞定Java BigDecimal精度问题(附Spring Boot配置建议)

从数据库设计到前端展示全面解决Java BigDecimal精度问题实战指南在电商系统开发中价格计算是核心业务逻辑之一。一个简单的折扣计算可能引发连锁反应用户输入0.66折数据库存储为float类型Java读取后乘以10却得到6.6000000000000005。这种精度问题不仅影响用户体验更可能导致财务对账差异。本文将带您从数据库选型开始贯穿整个技术栈彻底解决金融计算中的精度难题。1. 数据库层的精度基石设计金融级应用必须从数据存储源头确保精度。MySQL中常见的浮点类型有FLOAT、DOUBLE和DECIMAL但只有DECIMAL能提供精确计算类型存储空间精度特点适用场景FLOAT4字节约7位有效数字科学计算DOUBLE8字节约15位有效数字普通工程计算DECIMAL变长精确存储无精度损失金融、货币计算创建商品表时的最佳实践CREATE TABLE products ( id BIGINT PRIMARY KEY, price DECIMAL(19,4) NOT NULL COMMENT 支持万亿级金额保留4位小数, discount DECIMAL(3,2) UNSIGNED DEFAULT 1.00 COMMENT 折扣率0.00-1.00 );注意DECIMAL(M,D)中M表示总位数D表示小数位数。建议货币金额使用DECIMAL(19,4)可支持万亿级金额计算。2. Java实体类的正确建模方式数据库的DECIMAL字段映射到Java实体时必须使用BigDecimal类型。常见的ORM框架配置示例如下2.1 JPA实体定义Entity Table(name products) public class Product { Column(precision 19, scale 4) private BigDecimal price; Column(precision 3, scale 2) private BigDecimal discount; // 必须提供BigDecimal类型的setter/getter public BigDecimal getActualPrice() { return price.multiply(discount).setScale(2, RoundingMode.HALF_UP); } }2.2 MyBatis类型处理在MyBatis的mapper XML中直接使用BigDecimal类型即可resultMap idproductResult typecom.example.Product result columnprice propertyprice jdbcTypeDECIMAL/ result columndiscount propertydiscount jdbcTypeDECIMAL/ /resultMap初始化BigDecimal的黄金法则绝对不要使用double构造器new BigDecimal(0.1)→ 实际值为0.100000000000000005551115...推荐使用String构造器new BigDecimal(0.1)→ 精确等于0.1或者使用valueOf方法BigDecimal.valueOf(0.1)→ 内部会调用Double.toString()3. 业务逻辑中的精确计算实践BigDecimal的不可变性(immutable)特性使其线程安全但每次运算都会生成新对象。以下是电商场景常见计算模式3.1 订单金额计算模板public class OrderCalculator { // 商品单价 private final BigDecimal unitPrice; // 购买数量 private final int quantity; // 税率如0.13表示13% private final BigDecimal taxRate; public BigDecimal calculateTotal() { BigDecimal subtotal unitPrice.multiply(BigDecimal.valueOf(quantity)); BigDecimal tax subtotal.multiply(taxRate) .setScale(2, RoundingMode.HALF_UP); return subtotal.add(tax); } // 折扣计算示例 public BigDecimal applyDiscount(BigDecimal discountRate) { return calculateTotal().multiply(discountRate) .setScale(2, RoundingMode.HALF_DOWN); } }3.2 四则运算最佳实践运算类型方法注意事项加法add()注意标度对齐减法subtract()可能产生负数乘法multiply()结果标度为两个操作数标度之和除法divide()必须指定舍入模式复杂计算示例// 计算加权平均价格 public BigDecimal calculateWeightedAverage(ListBigDecimal prices, ListBigDecimal weights) { BigDecimal sumProduct BigDecimal.ZERO; BigDecimal sumWeight BigDecimal.ZERO; for (int i 0; i prices.size(); i) { sumProduct sumProduct.add(prices[i].multiply(weights[i])); sumWeight sumWeight.add(weights[i]); } return sumProduct.divide(sumWeight, 4, RoundingMode.HALF_UP); }4. 前后端数据交互的完美闭环即使后端计算完全正确前端显示仍可能出现问题。常见痛点包括科学计数法显示和精度不一致。4.1 Spring Boot全局配置方案Configuration public class JacksonConfig { Bean public ObjectMapper objectMapper() { ObjectMapper mapper new ObjectMapper(); // 配置BigDecimal序列化 mapper.registerModule(new SimpleModule() .addSerializer(BigDecimal.class, new JsonSerializer() { Override public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeString(value.setScale(2, RoundingMode.HALF_UP).toString()); } })); return mapper; } }4.2 前端处理方案配合后端配置前端可以直接使用格式化后的数值// 金额显示格式化 function formatCurrency(value) { return Number(value).toLocaleString(zh-CN, { minimumFractionDigits: 2, maximumFractionDigits: 2 }); } // 从后端API获取数据示例 fetch(/api/order/123) .then(res res.json()) .then(data { document.getElementById(totalAmount).innerText formatCurrency(data.total); });5. 并发环境下的线程安全策略BigDecimal的不可变性使其天然线程安全但在高并发场景仍需注意public class InventoryService { private final MapLong, BigDecimal priceMap new ConcurrentHashMap(); // 线程安全的折扣应用 public void applyGlobalDiscount(BigDecimal discount) { priceMap.replaceAll((id, price) - price.multiply(discount).setScale(2, RoundingMode.HALF_UP)); } // 原子性金额调整 public void adjustPrice(Long productId, BigDecimal delta) { priceMap.compute(productId, (id, price) - price ! null ? price.add(delta) : delta); } }性能优化技巧对于频繁使用的常量值如税率、折扣率应预先创建并复用BigDecimal实例在循环内部避免重复创建相同精度的BigDecimal考虑使用BigDecimal的线程本地缓存6. 常见陷阱与深度优化6.1 精度丢失的隐蔽场景// 错误示例 - double转换陷阱 BigDecimal badExample new BigDecimal(0.1); // 实际值: 0.1000000000000000055511151231257827021181583404541015625 // 正确做法 BigDecimal goodExample new BigDecimal(0.1);6.2 除法的九种舍入模式舍入模式描述示例(10/3)UP远离零方向舍入3.34DOWN向零方向舍入3.33CEILING向正无穷大舍入3.34FLOOR向负无穷大舍入3.33HALF_UP四舍五入3.33HALF_DOWN五舍六入3.33HALF_EVEN银行家舍入法3.33UNNECESSARY精确计算抛出ArithmeticException6.3 性能对比测试操作类型100万次耗时(ms)备注double加法15有精度风险BigDecimal加法320精确但较慢BigDecimal缓存值加法180复用对象提升性能在金融系统中精度优先于性能。但在高性能场景可以考虑以下优化// 使用预定义的常量 private static final BigDecimal HUNDRED new BigDecimal(100); // 在循环外部创建临时对象 BigDecimal temp BigDecimal.ZERO; for (BigDecimal num : numbers) { temp temp.add(num); }实际项目中我们曾遇到一个促销活动因double精度问题导致少收用户0.01元最终产生数万元损失。全面切换到BigDecimal后不仅解决了精度问题还因为代码可预测性增强减少了90%以上的金额相关bug。

相关文章:

从数据库设计到前端展示:一条龙搞定Java BigDecimal精度问题(附Spring Boot配置建议)

从数据库设计到前端展示:全面解决Java BigDecimal精度问题实战指南 在电商系统开发中,价格计算是核心业务逻辑之一。一个简单的折扣计算可能引发连锁反应:用户输入0.66折,数据库存储为float类型,Java读取后乘以10却得到…...

从命令行到自动化:用xrandr和Bash脚本打造你的Linux多屏工作流(附常用场景脚本)

从命令行到自动化:用xrandr和Bash脚本打造你的Linux多屏工作流 在Linux系统中管理多显示器配置,xrandr无疑是最强大的命令行工具之一。但每次手动输入复杂的xrandr命令来调整显示器布局,对于追求效率的高级用户来说,无疑是一种时间…...

深入剖析QWidget鼠标追踪失效:从setMouseTracking到事件拦截的完整解决方案

1. 为什么鼠标移动事件会突然失效? 最近在做一个Qt项目时,遇到了一个让人抓狂的问题:明明已经调用了setMouseTracking(true),但鼠标在某些区域移动时,mouseMoveEvent就是死活不触发。这让我百思不得其解,毕…...

VMware Workstation 17 Pro 保姆级教程:5分钟搞定Win11虚拟机TPM 2.0和安全启动配置

VMware Workstation 17 Pro 极速配置指南:Win11虚拟机TPM 2.0与安全启动实战 在虚拟化技术领域,VMware Workstation一直保持着领先地位。随着Windows 11的发布,许多开发者和技术爱好者都希望在虚拟机中体验这个新系统,却频繁遭遇T…...

告别PX4的玄学Bug:手把手教你用Mission Planner给ArduPilot飞控做全套硬件校准(附电调校准避坑指南)

告别PX4的玄学Bug:手把手教你用Mission Planner给ArduPilot飞控做全套硬件校准(附电调校准避坑指南) 作为一名长期与无人机打交道的开发者,我深知飞控系统稳定性对飞行安全的重要性。在尝试过PX4和ArduPilot两大主流固件后&#x…...

NotebookLM历史研究实战指南:5个被90%学者忽略的文献溯源技巧

更多请点击: https://intelliparadigm.com 第一章:NotebookLM历史研究实战指南:5个被90%学者忽略的文献溯源技巧 NotebookLM 作为 Google 推出的 AI 原生研究协作者,其核心能力并非泛泛摘要,而是基于可信文献源构建可…...

明日方舟素材库:从游戏资产到创意引擎的技术解密

明日方舟素材库:从游戏资产到创意引擎的技术解密 【免费下载链接】ArknightsGameResource 明日方舟客户端素材 项目地址: https://gitcode.com/gh_mirrors/ar/ArknightsGameResource 在数字创作的广阔天地中,专业级游戏素材往往被锁在商业游戏的围…...

如何让GPT-3开口说话?揭秘微调技巧,打造你的专属AI模型!

本文详细介绍了微调技术在AI模型中的应用,通过将通用模型如GPT-3进行微调,可以使其适应特定任务,如ChatGPT或GitHub Copilot。微调与普通提示词工程最大的区别在于,它能真正让模型学会数据,而非仅仅是“看到”数据。文…...

明日方舟游戏资源库:2000+高清素材的完整获取与应用指南

明日方舟游戏资源库:2000高清素材的完整获取与应用指南 【免费下载链接】ArknightsGameResource 明日方舟客户端素材 项目地址: https://gitcode.com/gh_mirrors/ar/ArknightsGameResource 还在为寻找高质量的明日方舟游戏素材而烦恼吗?无论是创作…...

免费在线化学编辑器Ketcher:5分钟学会专业分子绘图

免费在线化学编辑器Ketcher:5分钟学会专业分子绘图 【免费下载链接】ketcher Web-based molecule sketcher 项目地址: https://gitcode.com/gh_mirrors/ke/ketcher 想要免费在线绘制化学结构却找不到合适的工具?Ketcher这款基于Web的开源化学编辑…...

3分钟掌握B站视频下载神器BilibiliDown:跨平台免费开源下载工具

3分钟掌握B站视频下载神器BilibiliDown:跨平台免费开源下载工具 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_…...

官宣!网络安全法正式实施,人才缺口 327 万,这 5 类人直接站上风口,年薪百万不是梦

【必看收藏】网络安全人才抢夺战打响!新法实施后5类专业薪资翻倍,附学习路线 新《网络安全法》实施引爆网络安全人才市场,全球缺口480万,中国缺口327万以上。网络空间安全、信息安全、保密技术、网络安全科学与技术、信息对抗技术…...

VR-Reversal终极指南:免费将3D VR视频转换为2D播放的完整方案

VR-Reversal终极指南:免费将3D VR视频转换为2D播放的完整方案 【免费下载链接】VR-reversal VR-Reversal - Player for conversion of 3D video to 2D with optional saving of head tracking data and rendering out of 2D copies. 项目地址: https://gitcode.co…...

2026 最稳高薪副业 + 主业赛道,网络安全零基础系统学习大纲,实战项目 + 证书考取 + 求职面试一站式教程

网络空间安全建设刻不容缓,已成为国家安全建设的重中之重。 随着境内外敌对势力的大规模安全事件,《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地,网络安全产业从小众产业逐步发展成为国家…...

普通人 0 基础能转网安吗?转行路径全面拆解,告诉你到底值不值得

前言 最近在后台有看到很多朋友问我关于网络安全转行的问题,今天做了一些总结,其中最多的是,觉得目前的工作活多钱少、不稳定、一眼望到头,还有一些就是目前工作稳定但是缺乏上升空间的。总的来说,大家主要的问题是&a…...

全志T113-S3 SPI屏幕驱动踩坑实录:内核5.4下适配ILI9341的完整流程与代码修改

全志T113-S3 SPI屏幕驱动深度解析:内核5.4适配ILI9341的实战指南 在嵌入式开发领域,显示设备的驱动适配一直是工程师面临的核心挑战之一。全志T113-S3作为一款性价比突出的处理器,广泛应用于各类嵌入式场景,而ILI9341驱动的SPI屏幕…...

硬件调试利器:全面掌握AMD Ryzen处理器系统性能优化实战技巧

硬件调试利器:全面掌握AMD Ryzen处理器系统性能优化实战技巧 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: http…...

初创团队如何借助 Taotoken 的 Token Plan 有效控制大模型使用成本

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 初创团队如何借助 Taotoken 的 Token Plan 有效控制大模型使用成本 对于初创团队和独立开发者而言,在项目早期验证想法…...

VCF 9.1 实验室部署 ESX 配置变通方案

以下配置适用于资源受限环境、非生产用途,仅用于功能测试与学习目的。一、物理 ESX 9.1 主机1. vSAN 压缩算法(CPU 受限环境)VCF 9.1 默认从 LZ4 改为 Zstd,压缩率更高但 CPU 占用更高。切回 LZ4(无需重启)…...

ComfyUI-Inpaint-CropAndStitch终极指南:30倍加速AI图像修复的完整教程

ComfyUI-Inpaint-CropAndStitch终极指南:30倍加速AI图像修复的完整教程 【免费下载链接】ComfyUI-Inpaint-CropAndStitch ComfyUI nodes to crop before sampling and stitch back after sampling that speed up inpainting 项目地址: https://gitcode.com/gh_mir…...

智慧航运主题汇总(2026-05-13更新)

智慧航运主要包括利用区块链、大数据、5G、卫星通讯等技术手段,以“数字化、智能化”的理念,实现航运各个业务“提升效率、提升安全、降低风险、提高收益、提升客户体验”等目标。比如利用人工智能手段,实现船舶更加安全运行(防海…...

Vue3-DateTime-Picker:现代化Vue 3日期时间选择器的完整指南

Vue3-DateTime-Picker:现代化Vue 3日期时间选择器的完整指南 【免费下载链接】vue3-date-time-picker Datepicker component for Vue 3 项目地址: https://gitcode.com/gh_mirrors/vu/vue3-date-time-picker 在当今的Web开发中,日期时间选择器是几…...

上海国际航运研究中心:全球绿色航运发展报告(2024-2025)

本报告由上海国际航运研究中心与世界海事大学联合编制,聚焦 2024 年 1 月至 2025 年 9 月全球绿色航运发展,围绕政策、机制、清洁能源、减排技术、发展趋势五大核心展开,全面呈现航运业低碳转型的全球格局、关键进展与挑战。一、核心政策&…...

DLSS Swapper完全指南:3步轻松优化游戏性能的终极方案

DLSS Swapper完全指南:3步轻松优化游戏性能的终极方案 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款专为游戏玩家设计的智能工具,能够自动管理、下载和替换游戏中的DLSS、F…...

2026厦门国际智能交通运输产业博览会开幕:海外需求与国内先进技术的双向奔赴

2026年5月13日,为期三天的2026厦门国际智能交通运输产业博览会(CITSE 2026,以下简称“智交会”)隆重开幕。本届智交会由中国智能交通协会联合厦门会展集团股份有限公司共同举办,以“聚焦产业创新变革,赋能出…...

终极DeepL Chrome翻译插件完整指南:高效跨语言浏览解决方案

终极DeepL Chrome翻译插件完整指南:高效跨语言浏览解决方案 【免费下载链接】deepl-chrome-extension A DeepL Translator Chrome extension 项目地址: https://gitcode.com/gh_mirrors/de/deepl-chrome-extension 在全球化信息时代,阅读外文网页…...

3步轻松解锁QQ音乐加密文件:macOS用户必备的解码工具

3步轻松解锁QQ音乐加密文件:macOS用户必备的解码工具 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默认转…...

ArduPilot开源飞控之飞行模式切换逻辑与安全机制

1. ArduPilot飞行模式的核心价值与设计哲学 第一次接触ArduPilot的飞行模式时,我完全被它的设计哲学震撼到了。这个开源飞控系统将复杂的飞行控制抽象成几十种可切换的行为模式,就像给无人机装上了不同性格的大脑。Stabilize模式下飞机会自动保持平衡&am…...

5分钟快速上手!FanControl:你的Windows风扇智能管家终极指南

5分钟快速上手!FanControl:你的Windows风扇智能管家终极指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/G…...

别再死记硬背了!用一张时序图+五个核心状态,彻底搞懂5G NR入网(附RRC状态机详解)

5G NR入网流程:用状态机思维拆解终端与网络的第一次握手 当一部5G手机从关机状态按下电源键,到屏幕上显示"5G"信号图标,这短短几秒内发生了上百次信号交互。传统学习方式往往要求我们死记硬背每个步骤,但若能抓住五个核…...