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

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

📦 源码文件

相关文章
|
23小时前
|
安全 Java 数据安全/隐私保护
UUID三种字符串形态,这个Java工具类3个方法直接出
本工具类基于JDK 17+,提供三种RFC 4122 v4 UUID生成方法:标准36位小写带横线、紧凑32位小写、32位大写,均源自加密安全随机数,无参数、线程安全,适用于幂等键、链路追踪等场景。(239字)
|
2天前
|
算法 安全 Java
开放接口签名怎么算?这个Java工具类14个方法兼容微信支付宝
这是一个专为支付与开放平台设计的Java签名工具类(JDK17+),提供14个方法:支持参数自动字典序拼接、多算法摘要/HMAC签名(MD5/SHA256/HmacSHA256等)、大小写灵活输出、常量时间安全验签,并兼容微信、支付宝等老协议,开箱即用。
|
2天前
|
安全 前端开发 Java
验证码字符与算术题,这个Java工具类6个方法只产字符串
这是一个基于JDK 17+的轻量验证码工具类,提供6种安全随机生成能力:纯数字、大/小写字母(剔除易混淆字符)、混合字符(54字集)及算术题(加减乘),全部使用`SecureRandom`,线程安全,含严格边界校验与示例。
|
前端开发 程序员 开发者
免费下载!程序员入门系列教程之《零基础CSS入门教程》重磅推出
本书由阿里云开发者社区联合乘风者计划专家博主陈文阳共同推出。
24827 8
免费下载!程序员入门系列教程之《零基础CSS入门教程》重磅推出
|
云安全 安全 网络安全
|
15天前
|
JSON 程序员 数据格式
最新版Notepad++下载、安装、配置保姆级教程(附官网安装包)
Notepad++ 是一款免费开源、轻量快速的 Windows 文本编辑器,支持多标签、语法高亮、代码折叠与宏录制,体积小、启动快、资源占用低,兼容 x64/x32/ARM 架构,是程序员和文字工作者的高效利器。
3650 0
|
8天前
|
JavaScript 安全 前端开发
Nodejs Brotli decoder 代码执行漏洞 (CVE-2026-111497)10629
Node.js发布安全更新修复Brotli解码器高危RCE漏洞(CVE-2026-111497),建议受影响版本用户立即升级。
2046 2
|
14天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
2459 46
|
11天前
|
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真正“看懂并验证”前端代码。
1472 3

热门文章

最新文章