7个方法搞定小数与百分比格式化,全程BigDecimal不丢精度

简介: 这是一个基于BigDecimal的高精度金融格式化工具类,支持金额/比率的精准四舍五入(HALF_UP)、多级小数位控制、百分比转换及语言无关输出,要求JDK 17+,杜绝浮点误差,适用于对账、报表等严苛场景。

📋 目录

一、工具类功能

把金额、比率统一成固定小数位或带百分号的字符串,取整固定 HALF_UP 且全程走 BigDecimal,输出与语言环境无关,1.005 不会被浮点表示坑掉。

二、所需环境

JDK 17或以上

三、方法与调用示例(按需调用)

🔢 方法序号:1

🎯 方法用途:

  • 把 0 到 1 之间的小数比率换算成百分比字符串,默认保留两位小数
  • 完成率、转化率这类要直接贴到页面上的比率,一行就出成品

🧩 方法定义:public static String toPercent(double decimal)

🗣️ 入参解释:public static String toPercent(小数比率)

📤 返回值解释:String,形如 12.35% 的百分比串

💡 边界口径:

  • 比率乘 100 后按 RoundingMode.HALF_UP 取整,平局进位
  • 位数固定,不足补 0,1 就是 100.00%
  • 百分号是直接拼的 ASCII %,不跟随语言环境的百分比符号
  • NaN 与无穷大折不成 BigDecimal,按 JDK 语义抛 NumberFormatException

🧪 方法示例:

  • toPercent(0.12345d) 拿到 12.35%
  • toPercent(1d) 拿到 100.00%,补齐两位
  • toPercent(0.00125d) 拿到 0.13%,平局按 HALF_UP 进位而不是 0.12%
  • toPercent(Double.POSITIVE_INFINITY, 2) 抛 NumberFormatException

🔢 方法序号:2

🎯 方法用途:

  • 换算成百分比并自己指定小数位数
  • 报表只要整数百分比、接口文档要三位时用它,不用拿字符串再截

🧩 方法定义:public static String toPercent(double decimal, int scale)

🗣️ 入参解释:public static String toPercent(小数比率, 小数位数)

📤 返回值解释:String,指定小数位的百分比串

💡 边界口径:

  • scale 为 0 时只剩整数百分比,末尾的 .00 也不会出现
  • scale 为负抛 IllegalArgumentException,消息带上实际值
  • 取整与补 0 的口径同单参版

🧪 方法示例:

  • toPercent(0.12345d, 1) 拿到 12.3%
  • toPercent(0.12345d, 0) 拿到 12%
  • toPercent(0.125d, 0) 拿到 13%,同一口径换成 HALF_EVEN 会是 12%
  • toPercent(0.5d, -1) 抛 scale 不能为负数: -1

🔢 方法序号:3

🎯 方法用途:

  • 用 BigDecimal 当比率入参,不经过 double,高精度值不先掉位
  • 上游已经是 DECIMAL 或字符串构造的高精度比率时用这一版

🧩 方法定义:public static String toPercent(BigDecimal decimal, int scale)

🗣️ 入参解释:public static String toPercent(高精度比率, 小数位数)

📤 返回值解释:String,按指定位数取整后的百分比串

💡 边界口径:

  • 比率直接乘 100 再 setScale,全程不碰浮点
  • decimal 传 null 抛 NullPointerException,scale 为负抛 IllegalArgumentException
  • 位数够短时与 double 入口看不出差别,17 位以上有效数字才会分叉

🧪 方法示例:

  • toPercent(new BigDecimal("0.09876543"), 6) 拿到 9.876543%
  • 同一个数走 toPercent(0.09876543d, 6) 也拿到 9.876543%
  • toPercent((BigDecimal) null, 2) 抛 decimal 不能为 null

🔢 方法序号:4

🎯 方法用途:

  • 把金额一类的数固定成两位小数的字符串,末尾的 0 补齐
  • 页面金额列、对账单字段这类必须两位小数的场合直接用它

🧩 方法定义:public static String keepTwoDecimals(double num)

🗣️ 入参解释:public static String keepTwoDecimals(数值)

📤 返回值解释:String,两位小数的数字串

💡 边界口径:

  • 等价于 keepScale(num, 2),走的是 HALF_UP
  • 整数也带 .00,不会出现 5 这种缺位形态
  • NaN 与无穷大抛 NumberFormatException

🧪 方法示例:

  • keepTwoDecimals(3.1d) 拿到 3.10,末位补 0
  • keepTwoDecimals(5d) 拿到 5.00
  • keepTwoDecimals(1.005d) 拿到 1.01
  • keepTwoDecimals(Double.NaN) 抛 NumberFormatException

🔢 方法序号:5

🎯 方法用途:

  • 把数值固定成指定小数位的字符串,位数由 scale 决定
  • 单价要六位、汇总只要整数这类同一段代码里多种精度时用

🧩 方法定义:public static String keepScale(double num, int scale)

🗣️ 入参解释:public static String keepScale(数值, 小数位数)

📤 返回值解释:String,标度恒等于 scale 的数字串

💡 边界口径:

  • 不足位补 0,超出位按 HALF_UP 舍
  • scale 为 0 得到的是纯整数字符串,没有小数点
  • 极大金额走 toPlainString(),不会变成科学计数法
  • scale 为负抛 IllegalArgumentException

🧪 方法示例:

  • keepScale(0.5d, 6) 拿到 0.500000
  • keepScale(2.6d, 0) 拿到 3
  • keepScale(9.87654321E15d, 2) 拿到 9876543210000000.00,极大金额不会写成科学计数法

🔢 方法序号:6

🎯 方法用途:

  • 入参是 BigDecimal 的定版小数格式化,数据库 DECIMAL 的值直接进出不掉位
  • 高精度金额、报表落库字符串这类不能被 double 中转的场景用这一版

🧩 方法定义:public static String keepScale(BigDecimal num, int scale)

🗣️ 入参解释:public static String keepScale(高精度数值, 小数位数)

📤 返回值解释:String,标度恒等于 scale 的平面数字串

💡 边界口径:

  • 不做 doubleValue() 中转,17 位以上有效数字与 double 入口的结果会分叉
  • 科学计数法写出来的 BigDecimal 一样被展开成普通写法
  • num 传 null 抛 NullPointerException,scale 为负抛 IllegalArgumentException

🧪 方法示例:

  • keepScale(new BigDecimal("12345678901234567.89"), 2) 拿到 12345678901234567.89
  • 同一个数经 double 入口拿到 12345678901234568.00,末位已被浮点改掉
  • keepScale(new BigDecimal("1E+2"), 2) 拿到 100.00,科学计数法被展开
  • keepScale((BigDecimal) null, 2) 抛 num 不能为 null

🔢 方法序号:7

🎯 方法用途:

  • 四舍五入后返回 BigDecimal 对象,结果还要继续参与计算时用
  • 先取整再累加、再乘数量的链路里避免又转回字符串

🧩 方法定义:public static BigDecimal roundHalfUp(double num, int scale)

🗣️ 入参解释:public static BigDecimal roundHalfUp(数值, 小数位数)

📤 返回值解释:BigDecimal,标度恒等于 scale 的取整结果

💡 边界口径:

  • 返回值的标度就是入参位数,toPlainString() 与 keepScale 结果一致
  • 取整方向固定 HALF_UP,不做银行家舍入
  • scale 为负抛 IllegalArgumentException;NaN 与无穷大抛 NumberFormatException

🧪 方法示例:

  • roundHalfUp(1.005d, 2) 拿到 1.01,标度是 2
  • 上一步的结果再乘 3 拿到 3.03,可以直接继续算
  • keepScale(1.005d, 2).equals(rounded.toPlainString()) 拿到 true

四、工具类源码(可直接复制)

📦 源码文件

相关文章
|
云安全 安全 网络安全
|
7天前
|
JavaScript 安全 前端开发
Nodejs Brotli decoder 代码执行漏洞 (CVE-2026-111497)10629
Node.js发布安全更新修复Brotli解码器高危RCE漏洞(CVE-2026-111497),建议受影响版本用户立即升级。
2008 1
|
14天前
|
JSON 程序员 数据格式
最新版Notepad++下载、安装、配置保姆级教程(附官网安装包)
Notepad++ 是一款免费开源、轻量快速的 Windows 文本编辑器,支持多标签、语法高亮、代码折叠与宏录制,体积小、启动快、资源占用低,兼容 x64/x32/ARM 架构,是程序员和文字工作者的高效利器。
3195 0
|
13天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
2288 44
|
10天前
|
Web App开发 人工智能 前端开发
2026 年 AI 浏览器怎么选?Ego Lite、Tabbit、Chrome DevTools MCP 深度对比,开发者到底该用哪个?
2026年AI浏览器选型指南:Ego Lite专注多Agent协同(Mac优先),Tabbit国产首选,原生支持Windows与Codex控制;Chrome DevTools MCP非浏览器而是开发者利器,深度集成Console/Network/Performance调试能力,让AI真正“看懂并验证”前端代码。
1430 3
|
7天前
|
安全 应用服务中间件 Go
PHP2Shell 漏洞拆解:WordPress 与 nginx 为何中招
PHP2Shell 双 RCE 已遭在野利用:WordPress、Drupal 全在射程内,nginx 其实另有洞。拆成因与修复顺序
PHP2Shell 漏洞拆解:WordPress 与 nginx 为何中招
|
8天前
|
开发者 索引
DeepSeekHarness大肥鱼自带插件市场了?加个地址就能用
Open Plugin Market 是一个开放插件索引平台,收录800+优质DSH插件,支持分类浏览、智能推荐与随机发现。无需安装市场,粘贴索引地址即可一键接入,网页版直访 dshopen.org,助力小开发者被看见。(239字)
1737 1
DeepSeekHarness大肥鱼自带插件市场了?加个地址就能用
|
6天前
|
人工智能 Linux API
Magpie, 轻量本地AI网关!免费Token用不完!
Magpie 是开源AI编程模型调度网关,上线一月获1.8万Star。它通过本地高性能网关统一托管多平台API密钥、账号与免费额度,实现跨Agent的模型秒级切换、静默额度轮换与资源复用,显著降低碎片化管理成本。(239字)
Magpie, 轻量本地AI网关!免费Token用不完!
|
6天前
|
安全 程序员 应用服务中间件
PHP 被曝两大致命漏洞,请所有程序员抓紧做这件事!
PHP 官方发布了紧急安全更新,一口气修复了两个严重漏洞。如果网站和服务器用了 PHP 应该怎么处理?漏洞的原理是什么?本文给你讲清楚
701 0

热门文章

最新文章