Java 企业级工具类全家桶-22-人民币金额计算工具类

发布时间:2026/10/15 9:19:12

Java 企业级工具类全家桶-22-人民币金额计算工具类 目录一、工具类功能二、所需环境三、方法与调用示例按需调用四、工具类源码可直接复制一、工具类功能人民币金额的加减乘除、元分互转与千分位格式化一个类接住全程走 BigDecimal 避开 double 直接运算的精度丢失统一保留两位小数四舍五入、null 入参按 0 计。二、所需环境JDK 17或以上三、方法与调用示例按需调用方法序号1方法用途把多个金额一次加总结果固定两位小数、四舍五入全程走BigDecimal不用躲double相加掉精度null元素按 0 计不用先过滤方法定义public static BigDecimal add(BigDecimal... amounts)️入参解释public static BigDecimal add(相加的多个金额)返回值解释BigDecimal求和结果不为null标度恒为 2边界口径元素为null按 0 累加数组本身传null是编程错误抛IllegalArgumentException: 相加金额数组不能为null一个都不传、或全是null都得到0.00结果标度恒为 2第三位小数当场按四舍五入收掉不会留到下游再决定金额很大时用long/int累加的溢出担忧在这里不存在方法示例add(new BigDecimal(10.00), new BigDecimal(7.50), null)拿到17.50add()一个都不传拿到0.00add(null, null)全是null元素拿到0.00add(new BigDecimal(0.001), new BigDecimal(0.002))拿到0.00半分以下被收掉add(BigDecimal.ONE, BigDecimal.TEN)的scale()拿到2add((BigDecimal[]) null)抛IllegalArgumentException: 相加金额数组不能为null方法序号2方法用途把可能是null的金额兜成BigDecimal.ZERO后续运算不用再判空从数据库、报文里取出来的金额字段直接喂进加减乘除不用每处写三元判断方法定义public static BigDecimal nullToZero(BigDecimal amount)️入参解释public static BigDecimal nullToZero(金额)返回值解释BigDecimal非null的金额入参不是null时原样返回边界口径只兜null不改标度也不做舍入非null的入参按同一个引用返回兜出来的BigDecimal.ZERO标度是 0要两位小数得再setScale(2, HALF_UP)本类其它方法内部已经调它单独用它只是为了让自己写的求和代码少一处判空方法示例nullToZero(null)拿到0scale()是0不是0.00nullToZero(new BigDecimal(3.14159))拿到3.14159一位没被收掉方法序号3方法用途算两个金额的差被减数减减数结果两位小数、四舍五入余额扣减、退款找差这类场景直接调null按 0 计方法定义public static BigDecimal subtract(BigDecimal minuend, BigDecimal subtrahend)️入参解释public static BigDecimal subtract(被减数, 减数)返回值解释BigDecimal差值标度恒为 2边界口径两个入参都可以是null各按 0 计结果可以是负数扣超了不会替你把符号抹平参数顺序是被减数在前、减数在后写反了符号就反了方法示例subtract(new BigDecimal(100.00), new BigDecimal(23.60))余额扣减拿到76.40subtract(new BigDecimal(100), new BigDecimal(123.75))拿到-23.75扣超了就是负数subtract(null, null)拿到0.00方法序号4方法用途算两个金额或金额与数量的乘积结果两位小数、四舍五入单价乘数量、按比例算钱一行搞定不用再手动setScale方法定义public static BigDecimal multiply(BigDecimal multiplier, BigDecimal multiplicand)️入参解释public static BigDecimal multiply(乘数, 被乘数)返回值解释BigDecimal乘积标度恒为 2边界口径任一入参为null按 0 计结果就是0.00舍入发生在乘完之后先把两位小之外的第三位按四舍五入收掉不做两次舍入数量类入参比如3、1.5也当金额传标度不影响结果方法示例multiply(new BigDecimal(1.3335), new BigDecimal(5))单价乘数量拿到6.67multiply(new BigDecimal(0.1), new BigDecimal(0.2))拿到0.02double算法在这里会给0.020000000000000004multiply(null, BigDecimal.TEN)拿到0.00multiply(new BigDecimal(1.005), BigDecimal.ONE)拿到1.01方法序号5方法用途两个金额相除默认保留两位小数、四舍五入均摊、单价反算这类除法不用再包一层setScale除零也被转成说得清的异常方法定义public static BigDecimal divide(BigDecimal dividend, BigDecimal divisor)️入参解释public static BigDecimal divide(被除数, 除数)返回值解释BigDecimal商标度为 2边界口径就是三参版把小数位数固定成 2 的入口除数为 0 或为null按 0 计抛IllegalArgumentException: 除数不能为 0不会漏出 JDK 的ArithmeticException被除数为null按 0 计拿到0.00方法示例divide(new BigDecimal(100), new BigDecimal(3))百人均摊拿到33.33divide(BigDecimal.ONE, BigDecimal.ZERO)抛IllegalArgumentException: 除数不能为 0divide(null, BigDecimal.TEN)拿到0.00divide(BigDecimal.TEN, null)抛IllegalArgumentException: 除数不能为 0方法序号6方法用途两个金额相除并自己指定保留几位小数费率、单位成本这类要更多位数的商不用为了多两位小数先放大再缩小方法定义public static BigDecimal divide(BigDecimal dividend, BigDecimal divisor, int scale)️入参解释public static BigDecimal divide(被除数, 除数, 小数位数)返回值解释BigDecimal商标度就是传入的小数位数边界口径小数位数给 0 得到整数商给负数抛IllegalArgumentException: 小数位数不能为负: -1除数为 0 同样抛IllegalArgumentException与位数无关舍入仍是四舍五入指定位数之外的部分被收掉方法示例divide(new BigDecimal(100), new BigDecimal(3), 6)拿到33.333333divide(new BigDecimal(1), new BigDecimal(3), 10)拿到0.3333333333divide(new BigDecimal(100), new BigDecimal(3), 0)拿到33标度 0divide(BigDecimal.ONE, BigDecimal.TEN, -1)抛IllegalArgumentException: 小数位数不能为负: -1方法序号7方法用途把元转成分交回一个long正好对上银行和支付渠道按分传整数的约定不足一分的部分四舍五入进率固定 100不用自己乘 100 再担心精度方法定义public static long yuanToFen(BigDecimal yuan)️入参解释public static long yuanToFen(金额元)返回值解释long金额分边界口径金额为null按 0 计拿到0四舍五入是离零方向的1.005元进成 101 分-0.005元进成 -1 分超出long能表达的分数抛IllegalArgumentException不会静默截断成别的数结果是long而不是BigDecimal转完再想加总要注意精度口径方法示例yuanToFen(new BigDecimal(1.005))拿到101分yuanToFen(new BigDecimal(1.004))拿到100分yuanToFen((BigDecimal) null)拿到0yuanToFen(new BigDecimal(-0.005))拿到-1yuanToFen(new BigDecimal(1E20))抛IllegalArgumentException消息是「金额超出可表示范围单位分: 1E20」方法序号8方法用途直接把前端传来的金额文本转成分跳过自己new BigDecimal(...)这一步表单里的128.50、空字符串都能吃下解不出来时说得清是哪段文本的问题方法定义public static long yuanToFen(String yuanText)️入参解释public static long yuanToFen(金额文本元)返回值解释long金额分边界口径null、空串、全空白都按 0 计拿到0文本先去掉首尾空白再解析1E3这种科学计数法按BigDecimal的规则认拿到100000分带千分位逗号的文本1,234.5不认抛IllegalArgumentException要处理展示串得先把逗号去掉解析成功后的分数量级仍受long约束超限抛IllegalArgumentException方法示例yuanToFen(128.50)拿到12850分yuanToFen( )拿到0分空串与null同样是0yuanToFen( 128.50 )拿到12850首尾空白被去掉yuanToFen(1E3)拿到100000yuanToFen(abc)抛IllegalArgumentException: 无法解析的金额文本: abcyuanToFen(1,234.5)抛IllegalArgumentException: 无法解析的金额文本: 1,234.5方法序号9方法用途把渠道给的分数转回以元为单位的金额两位小数展示、入账前统一单位不用自己divide(100)还担心标度方法定义public static BigDecimal fenToYuan(long fen)️入参解释public static BigDecimal fenToYuan(金额分)返回值解释BigDecimal金额元标度恒为 2边界口径进率固定 100分数本来就是整数这里不会出现舍入损失负数照常转-1分就是-0.01元入参是long分数量级超过long的数据应该在上游就拦住方法示例fenToYuan(12850L)拿到128.50fenToYuan(0L)拿到0.00标度仍是 2fenToYuan(-1L)拿到-0.01fenToYuan(Long.MAX_VALUE)拿到92233720368547758.07方法序号10方法用途分转元后直接交出两位小数的字符串接口回包和页面渲染能直接用免去BigDecimal到字符串这一步也不会被toString的科学计数法写法坑到方法定义public static String fenToYuanText(long fen)️入参解释public static String fenToYuanText(金额分)返回值解释String形如1.23的金额文本边界口径内部就是fenToYuan(fen).toPlainString()永远不会出现E记数法两位小数补齐5 分是0.05而不是0.5不带货币符号、不带千分位要展示成对账单样子用方法11方法示例fenToYuanText(12850L)拿到128.50fenToYuanText(5L)拿到0.05不足一位也补零方法序号11方法用途把金额格式化成带千分位的展示串固定两位小数、四舍五入对账单、报表、小票这类要给人看的地方直接用它输出不随 JVM 语言环境变方法定义public static String formatThousands(BigDecimal amount)️入参解释public static String formatThousands(金额)返回值解释String千分位金额文本分组符恒为逗号、小数分隔符恒为点号边界口径数字符号固定按Locale.ROOT换成中文或德语语言环境跑输出仍是逗号分组、点号小数金额为null按 0 计拿到0.00小数第三位按四舍五入收掉1234567.891出来是1,234,567.89负数舍入到零时结果会是-0.00展示前要判断的话记得这条方法示例formatThousands(new BigDecimal(1234567.891))拿到1,234,567.89formatThousands(null)拿到0.00formatThousands(new BigDecimal(-9876543.217))拿到-9,876,543.22formatThousands(new BigDecimal(1000))拿到1,000.00整数也补两位小数formatThousands(new BigDecimal(-0.004))拿到-0.00四、工具类源码可直接复制领取方式 关注点赞收藏私信回复「java工具类」可领取100个工具类「Java企业级工具类全家桶1-100」的完整源码 工具类已调试通过复制粘贴即可使用省时省力 可保存到自己网盘永久有效觉得对您有帮助麻烦点点关注啦您的关注是我创作的最大动力~
延伸阅读

更多相关文章

2026/10/15 9:14:10

Diagram-Design:用可编程图表驱动系统演进

1. 项目概述:这不是画图,是构建可演进的系统表达语言“diagram-design”这个标题乍看像一个工具操作指令,但在我过去十年带过的几十个跨领域项目里,它从来不是关于“怎么把流程图画得好看一点”的问题。它本质是一套用图形化方式承…

2026/10/15 9:14:10

AMD 82亿美元收购World Labs:世界模型与物理AI算力布局解析

1. 这笔交易到底在买什么1.1 从标题说起:82亿美元不是买一个模型文件看到“AMD 82亿美元收购 World Labs”这个标题,很多人的第一反应是:AMD终于要在AI模型层面跟英伟达正面刚了。但如果你只把这件事理解成“买了一个世界模型”,那…

2026/10/15 9:14:10

RTMP流媒体技术实战:从推流到播放优化

1. RTMP流媒体技术概述RTMP(Real-Time Messaging Protocol)作为Adobe公司开发的实时消息传输协议,在流媒体领域已经服役超过15年。虽然近年来有WebRTC等新技术崛起,但RTMP凭借其低延迟(通常500ms-3s)和广泛…

2026/10/15 10:35:11

算法时间复杂度与八大排序选型实战指南

1. 这不是背公式,而是理解“算法成本”的真实账本 刚接触数据结构时,我见过太多人把时间复杂度记成一句顺口溜:“O(1)是常数,O(n)是线性,O(n)是平方……”然后在笔试题里对着冒泡排序写个O(n),心里还觉得挺…

2026/10/15 10:35:11

Python Flask/Django开发智慧校园管理系统实战

1. 项目概述:智慧校园管理系统开发背景十年前我第一次接触教育信息化项目时,某中学的教务主任拿着厚厚一叠纸质考勤表对我说:"每天光是统计这些数据,就要耗掉两个老师半天时间。"这个场景促使我开始思考如何用技术改变传…

2026/10/15 10:35:11

6款免费AI工具实测:高效替代付费方案

1. 工具实测背景与价值作为一名长期关注效率工具的数字内容创作者,我发现在AI技术爆发的当下,许多学生群体和职场新人常常面临两个痛点:一是专业级AI工具订阅费用高昂,二是难以辨别哪些免费工具真正实用。最近我系统测试了学长学姐…

2026/10/15 10:35:11

Python Flask/Django构建智慧校园管理系统实践

1. 项目背景与需求分析智慧校园管理系统在中小学教育信息化建设中扮演着越来越重要的角色。传统校园管理存在信息孤岛、流程繁琐、数据利用率低等问题,而基于Python Flask/Django框架开发的系统能够有效整合教务、行政、后勤等多维度数据,实现校园管理的…

2026/10/15 10:30:09

Superpowers开源效率工具:从安装配置到自动化工作流搭建

Superpowers 这个名字起得挺中二,但真正装上用了一段时间之后,你会发现它其实一点没夸张——这套开源效率工具集干的事情,就是字面意义上的“给你的工作流叠 buff”。我最初是在逛开源社区的时候刷到它的,当时搜“superpowers”出…

2026/10/14 11:31:03

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/14 17:41:07

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/14 2:32:55

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/15 0:02:22

防关联浏览器哪个好?三款产品实测差异解析

新手做多店铺,最纠结的就是防关联浏览器选哪个。飞跨、网易、站斧这三款被问得最多,先给结论:要一体化省心、长期便宜,选站斧;要网易招牌和稳,选网易;预算紧做东南亚 Lazada,选飞跨。…

2026/10/15 0:02:22

影刀RPA深度实战:大模型Fine-tuning定制RPA专用Prompt与指令生成

影刀RPA深度实战:大模型Fine-tuning定制RPA专用Prompt与指令生成 一、技术背景 大模型(LLM)在通用场景下表现强大,但当我们将 GPT-4 或 Qwen 直接用于生成影刀RPA操作指令和 XPath 定位时,准确率通常只有 40%-60%。原因…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑