📋 目录
一、工具类功能
把金额、比率统一成固定小数位或带百分号的字符串,取整固定 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,末位补 0keepTwoDecimals(5d)拿到5.00keepTwoDecimals(1.005d)拿到1.01keepTwoDecimals(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.500000keepScale(2.6d, 0)拿到3keepScale(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
四、工具类源码(可直接复制)
📦 源码文件