public final class NumberUtil extends Object
Integer,Long,BigDecimal等数据类型.
RoundingMode.HALF_UP与 Math.round(double)的区别:注意
RoundingMode.HALF_UP-2.5 会变成-3,如果是Math.round(-2.5)会是-2
Double转BigDecimal:对于 double 转成 BigDecimal,推荐使用 BigDecimal.valueOf(double),不建议使用new BigDecimal(double),参见 JDK API
- new BigDecimal(0.1)
==>0.1000000000000000055511151231257827021181583404541015625- BigDecimal.valueOf(0.1)
==>0.1在《Effective Java 》这本书中也提到这个原则,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用
BigDecimal.
字段 说明 RoundingMode.UP远离零的方向舍入. 向绝对值最大的方向舍入,只要舍弃位非0即进位. RoundingMode.DOWN靠近零的方向舍入,向绝对值最小的方向输入,所有的位都要舍弃,不存在进位情况. RoundingMode.CEILING靠近正无穷方向舍入 向正无穷方向舍入 向正最大方向靠拢.
若是正数,舍入行为类似于ROUND_UP,
若为负数,舍入行为类似于ROUND_DOWN.
Math.round()方法就是使用的此模式.RoundingMode.FLOOR靠近负无穷方向舍入 向负无穷方向舍入 向负无穷方向靠拢.
若是正数,舍入行为类似于ROUND_DOWN;
若为负数,舍入行为类似于ROUND_UP.RoundingMode.HALF_UP四舍五入,生活中的舍入方法.
最近数字舍入(5进).这是我们最经典的四舍五入.RoundingMode.HALF_DOWN五舍六入,最近数字舍入(5舍). 在这里5是要舍弃的. RoundingMode.HALF_EVEN精确舍入,银行家舍入法.
四舍六入;五分两种情况,如果前一位为奇数,则入位,否则舍去.
以下例子为保留小数点1位,那么这种舍入方式下的结果:
1.15 返回 1.21.25 返回 1.2RoundingMode.UNNECESSARY无需舍入 关于
RoundingMode.HALF_EVEN:该算法是由美国银行家提出了,主要用于修正采用上面四舍五入规则而产生的误差。如下: 舍去位的数值小于5时,直接舍去。 舍去位的数值大于5时,进位后舍去。 当舍去位的数值等于5时, 若5后面还有其他非0数值,则进位后舍去, 若5后面是0时,则根据5前一位数的奇偶性来判断,奇数进位,偶数舍去。对于上面的规则我们举例说明:11.556 = 11.56 ------六入 11.554 = 11.55 -----四舍 11.5551 = 11.56 -----五后有数进位 11.545 = 11.54 -----五后无数,若前位为偶数应舍去 11.555 = 11.56 -----五后无数,若前位为奇数应进位
Integer,
Long,
BigDecimal,
Number,
NumberPattern,
RoundingMode,
NumberUtils| Modifier and Type | Field and Description |
|---|---|
static int |
BILLION
十亿,
1000000000. |
static int |
HUNDRED
百,
100. |
static int |
HUNDRED_MILLION
亿,
100000000. |
static int |
HUNDRED_THOUSAND
十万,
100000. |
static int |
MILLION
百万,
1000000. |
static int |
ONE
一,
1. |
static int |
TEN
十,
10. |
static long |
TEN_BILLION
百亿,
10000000000L. |
static int |
TEN_MILLION
千万,
10000000. |
static int |
TEN_THOUSAND
万,
10000. |
static int |
THOUSAND
千,
1000. |
| Modifier and Type | Method and Description |
|---|---|
static BigDecimal |
getAddValue(Number... numbers)
所有数加起来.
|
static BigDecimal |
getDivideValue(Number one,
Number two,
int scale)
|
static BigDecimal |
getDivideValue(Number one,
Number two,
int scale,
RoundingMode roundingMode)
获得除法结果
one/two,指定舍入方式 roundingMode 以及 小数位数 scale. |
static BigDecimal |
getMultiplyValue(Number one,
Number two,
int scale)
|
static String |
getProgress(Number current,
Number total,
String numberPattern)
计算进度(当前量
current/总量 total,然后转成指定的字符串格式 numberPattern). |
static BigDecimal |
getSubtractValue(Number beSubtractedValue,
Number... subtractions)
所有数相减.
|
static boolean |
isEquals(Number one,
Number two)
判断第1个数字数字值
one 是不是= (等于) 第2个数字数字值 two. |
static boolean |
isGatherThan(Number one,
Number two)
判断第1个数字数字值
one 是不是> (大于) 第2个数字数字值 two. |
static boolean |
isGatherThanOrEquals(Number one,
Number two)
判断第1个数字数字值
one 是不是>= (大于等于) 第2个数字数字值 two. |
static boolean |
isLessThan(Number one,
Number two)
判断第1个数字数字值
one 是不是< (小于) 第2个数字数字值 two. |
static boolean |
isLessThanOrEquals(Number one,
Number two)
判断第1个数字数字值
one 是不是<= (小于等于) 第2个数字数字值 two. |
static BigDecimal |
setScale(Number value,
int scale)
使用四舍五入
RoundingMode.HALF_UP 设置小数点位数. |
static BigDecimal |
setScale(Number value,
int scale,
RoundingMode roundingMode)
使用
roundingMode 来设置小数点位数. |
static String |
toString(Number value,
String numberPattern)
将数字
value 按照指定的格式 numberPattern 格式成字符串 . |
public static final int ONE
1.BigDecimal.ONE,
NumberUtils.INTEGER_ONE,
Constant Field Valuespublic static final int TEN
10.public static final int HUNDRED
100.public static final int THOUSAND
1000.public static final int TEN_THOUSAND
10000.public static final int HUNDRED_THOUSAND
100000.public static final int MILLION
1000000.public static final int TEN_MILLION
10000000.public static final int HUNDRED_MILLION
public static final int BILLION
public static final long TEN_BILLION
public static boolean isGatherThan(Number one, Number two)
one 是不是> (大于) 第2个数字数字值 two.
- 是将两个数组转成 BigDecimal 类型,并调用
BigDecimal.compareTo(BigDecimal)比较大小
NumberUtil.isGatherThan(0, 0) =false NumberUtil.isGatherThan(5, 4) =true NumberUtil.isGatherThan(5, 4L) =true NumberUtil.isGatherThan(5, 4.0f) =true NumberUtil.isGatherThan(5, 4.0d) =true NumberUtil.isGatherThan(5, toBigDecimal(4.0d)) =true NumberUtil.isGatherThan(toBigDecimal(5.0d), 4) =true
one - 第1个数字two - 第2个数字one 大于 two,那么返回true,否则返回false one 是null,抛出 NullPointerExceptiontwo 是null,抛出 NullPointerExceptionpublic static boolean isGatherThanOrEquals(Number one, Number two)
one 是不是>= (大于等于) 第2个数字数字值 two.
- 是将两个数组转成 BigDecimal 类型,并调用
BigDecimal.compareTo(BigDecimal)比较大小
NumberUtil.isGatherThanOrEquals(0, 0) =true NumberUtil.isGatherThanOrEquals(5, 4) =true NumberUtil.isGatherThanOrEquals(5, 4L) =true NumberUtil.isGatherThanOrEquals(5, 4.0f) =true NumberUtil.isGatherThanOrEquals(5, 4.0d) =true NumberUtil.isGatherThanOrEquals(5, toBigDecimal(4.0d)) =true NumberUtil.isGatherThanOrEquals(toBigDecimal(5.0d), 4) =true
one - 第1个数字two - 第2个数字one 大于等于 two,那么返回true,否则返回falseone 是null,抛出 NullPointerExceptiontwo 是null,抛出 NullPointerExceptionpublic static boolean isEquals(Number one, Number two)
one 是不是= (等于) 第2个数字数字值 two.
- 是将两个数组转成 BigDecimal 类型,并调用
BigDecimal.compareTo(BigDecimal)比较大小
NumberUtil.isEquals(0, 0) =true NumberUtil.isEquals(5, 4) =false NumberUtil.isEquals(5, 5L) =true NumberUtil.isEquals(5, 5.0f) =true NumberUtil.isEquals(5, 5.0d) =true NumberUtil.isEquals(5, toBigDecimal(5.0d)) =true NumberUtil.isEquals(toBigDecimal(5.0d), 5) =true
one - 第1个数字two - 第2个数字one 等于 two,那么返回true,否则返回false.one 是null,抛出 NullPointerExceptiontwo 是null,抛出 NullPointerExceptionpublic static boolean isLessThan(Number one, Number two)
one 是不是< (小于) 第2个数字数字值 two.
- 是将两个数组转成 BigDecimal 类型,并调用
BigDecimal.compareTo(BigDecimal)比较大小
NumberUtil.isLessThan(0, 0) =false NumberUtil.isLessThan(5, 4) =false NumberUtil.isLessThan(5, 5L) =false NumberUtil.isLessThan(5, 5.0f) =false NumberUtil.isLessThan(4, 5.0d) =true NumberUtil.isLessThan(5, toBigDecimal(5.0d)) =false NumberUtil.isLessThan(toBigDecimal(5.0d), 5) =false
one - 第1个数字two - 第2个数字one 小于 two,那么返回true,否则返回false.one 是null,抛出 NullPointerExceptiontwo 是null,抛出 NullPointerExceptionpublic static boolean isLessThanOrEquals(Number one, Number two)
one 是不是<= (小于等于) 第2个数字数字值 two.
- 是将两个数组转成 BigDecimal 类型,并调用
BigDecimal.compareTo(BigDecimal)比较大小
NumberUtil.isLessThanOrEquals(0, 0) =true NumberUtil.isLessThanOrEquals(5, 4) =false NumberUtil.isLessThanOrEquals(5, 5L) =true NumberUtil.isLessThanOrEquals(5, 5.0f) =true NumberUtil.isLessThanOrEquals(4, 5.0d) =true NumberUtil.isLessThanOrEquals(5, toBigDecimal(5.0d)) =true NumberUtil.isLessThanOrEquals(toBigDecimal(5.0d), 5) =true
one - 第1个数字two - 第2个数字one 小于等于 two,那么返回true,否则返回false one 是null,抛出 NullPointerExceptiontwo 是null,抛出 NullPointerExceptionpublic static BigDecimal getDivideValue(Number one, Number two, int scale)
one/two,四舍五入RoundingMode.HALF_UP,小数位数 scale 指定.
NumberUtil.getDivideValue(0, 2, 0) = toBigDecimal(0) NumberUtil.getDivideValue(6, 4, 0) = toBigDecimal(2) NumberUtil.getDivideValue(10, 3, 2) = toBigDecimal(3.33) NumberUtil.getDivideValue(5, 3, 2) = toBigDecimal(1.67)
one - 除数two - 被除数,自动转成BigDecimal做除法运算scale - 标度,小数的位数,四舍五入,用于 BigDecimal.setScale(int, RoundingMode)one 是 null,抛出 NullPointerExceptiontwo 是 null,抛出 NullPointerExceptiontwo 是 0,抛出 IllegalArgumentExceptionBigDecimal 返回除法结果one/two,四舍五入 RoundingMode.HALF_UP,小数位数 scale 指定RoundingMode.HALF_UP,
BigDecimal.ROUND_HALF_UP,
getDivideValue(Number, Number, int, RoundingMode)public static BigDecimal getDivideValue(Number one, Number two, int scale, RoundingMode roundingMode)
one/two,指定舍入方式 roundingMode 以及 小数位数 scale.
NumberUtil.getDivideValue(0, 2, 0,RoundingMode.HALF_UP) = 0 NumberUtil.getDivideValue(6, 4, 0,RoundingMode.HALF_UP) = 2 NumberUtil.getDivideValue(10, 3, 2,RoundingMode.HALF_UP) = 3.33 NumberUtil.getDivideValue(5, 3, 2,RoundingMode.HALF_UP) = 1.67
one - 除数two - 被除数,自动转成BigDecimal做除法运算scale - 标度,小数的位数,四舍五入,用于 BigDecimal.setScale(int, RoundingMode)roundingMode - 舍入法 RoundingModeone 是 null,抛出 NullPointerExceptiontwo 是 null,抛出 NullPointerExceptiontwo 是 0,抛出 IllegalArgumentExceptionBigDecimal 返回除法结果one/two,依据舍入法 roundingMode,小数位数 scale 指定BigDecimal.divide(BigDecimal, int, RoundingMode)public static BigDecimal getMultiplyValue(Number one, Number two, int scale)
one 和第二个数字 two 相乘,指定精度 scale, 返回BigDecimal.
NumberUtil.getMultiplyValue(5, 2, 5) = toBigDecimal("10.00000")
NumberUtil.getMultiplyValue(new BigDecimal(6.25), 1.17, 5) = toBigDecimal("7.31250")
NumberUtil.getMultiplyValue(9.86, 100, 0) = toBigDecimal("986")
one - 乘数two - 被乘数scale - 标度,小数的位数,四舍五入,用于 BigDecimal.setScale(int, RoundingMode)one 是 null,抛出 NullPointerExceptiontwo 是 null,抛出 NullPointerExceptionBigDecimal and multiply each othersetScale(Number, int)public static BigDecimal getAddValue(Number... numbers)
- 支持跳过null 元素相加 (since 1.11.5)
- 但是如果所有元素都是null ,将会抛出
IllegalArgumentException
NumberUtil.getAddValue(2, 4, 5) = 11 NumberUtil.getAddValue(new BigDecimal(6), 5) = 11 NumberUtil.getAddValue(new BigDecimal(6), null) = 6
numbers - the numbersnumbers 是null,抛出 NullPointerExceptionnumbers 是empty,抛出 IllegalArgumentExceptionIllegalArgumentExceptionBigDecimal,并进行累加操作public static BigDecimal getSubtractValue(Number beSubtractedValue, Number... subtractions)
NumberUtil.getSubtractValue(0, 2, 3) = -5 NumberUtil.getSubtractValue(0,null) = 0 NumberUtil.getSubtractValue(0, new Integer[5]) = 0 NumberUtil.getSubtractValue(2, 1.1) = 0.9 NumberUtil.getSubtractValue(1000, 99.5, 99.0) = 801.5 NumberUtil.getSubtractValue(1000, 50, null) = 950 NumberUtil.getSubtractValue(-1000, -50, 100) = -1050 NumberUtil.getSubtractValue(null, 5) // NullPointerException
beSubtractedValue - 被减数,如 100-10-5, 其中的100 就是被减数subtractions - 减数,如 100-10-5, 其中的10 和5 就是减数beSubtractedValue 是null,抛出 NullPointerExceptionsubtractions 是null或者是empty,直接将beSubtractedValue 转成BigDecimal 并返回subtractions ,使用 beSubtractedValue减去元素的值,如果循环的原始null,跳过这次减法public static String toString(Number value, String numberPattern)
value 按照指定的格式 numberPattern 格式成字符串 .
调用 NumberFormatUtil.format(Number, String, RoundingMode),当遇到需要舍入的时候,使用常用的 RoundingMode.HALF_UP
value:请尽量传递Integer,Long,BigDecimal,而不要使用 float,double等浮点类型,否则可能结果不准确,特别是jdk8以下的版本,具体参见 NumberFormatUtilTest 在 jdk8 下面测试不通过
//将数字转成百分数字符串,不带小数点 NumberUtil.toString(0.24f, NumberPattern.PERCENT_WITH_NOPOINT) = 24% //将数字转成百分数字符串,带两位小数点 NumberUtil.toString(0.24f, NumberPattern.PERCENT_WITH_2POINT) = 24.00% NumberUtil.toString(toBigDecimal(1.15), "#####.#") = 1.2 NumberUtil.toString(toBigDecimal(1.25), "#####.#") = 1.3 NumberUtil.toString(toBigDecimal(1.251), "#####.#") = 1.3 NumberUtil.toString(toBigDecimal(-1.15), "#####.#") = -1.2 NumberUtil.toString(toBigDecimal(-1.25), "#####.#") = -1.3 NumberUtil.toString(toBigDecimal(-1.251), "#####.#") = -1.3 NumberUtil.toString(toBigDecimal(25.5), "RP #####") = RP 26
value - 值numberPattern - 转成字符串格式 NumberPatternvalue 是null,抛出 NullPointerExceptiontoStringPattern 是null,抛出 NullPointerExceptiontoStringPattern 是blank,抛出 IllegalArgumentExceptionNumberFormatUtil.format(Number, String, RoundingMode)public static String getProgress(Number current, Number total, String numberPattern)
current/总量 total,然后转成指定的字符串格式 numberPattern).
常用于友好的显示 下载进度,执行进度等等场景
NumberUtil.getProgress(5, 5, NumberPattern.PERCENT_WITH_NOPOINT) = "100%" NumberUtil.getProgress(2, 3, NumberPattern.PERCENT_WITH_1POINT) = "66.7%"
current - 当前量total - 总量numberPattern - 转成字符串格式 NumberPatterncurrent 是null,抛出 NullPointerExceptiontotal 是null,抛出 NullPointerExceptioncurrent <= 0,抛出 IllegalArgumentExceptiontotal <= 0,抛出 IllegalArgumentExceptioncurrent > total,抛出 IllegalArgumentExceptiontoStringPattern 是null,抛出 NullPointerExceptiontoStringPattern 是blank,抛出 IllegalArgumentExceptionNumberPattern,
getDivideValue(Number, Number, int),
toString(Number, String)public static BigDecimal setScale(Number value, int scale)
RoundingMode.HALF_UP 设置小数点位数.
NumberUtil.setScale(5, 5) = toBigDecimal("5.00000")
NumberUtil.setScale(5.2, 3) = toBigDecimal("5.200")
NumberUtil.setScale(5.26, 1) = toBigDecimal("5.3")
NumberUtil.setScale(-5.26, 1) = toBigDecimal("-5.3")
NumberUtil.setScale(-0, 1) = toBigDecimal("0.0")
NumberUtil.setScale(0, 1) = toBigDecimal("0.0")
NumberUtil.setScale(0, 2) = toBigDecimal("0.00")
- 被舍入部分
>=0.5向上,否则向下
RoundingMode.HALF_UP-2.5 会变成-3,如果是 Math.round(-2.5) 会是-2
value - numberscale - 标度,小数的位数,四舍五入,用于 BigDecimal.setScale(int, RoundingMode)value 是null,抛出 NullPointerExceptionRoundingMode.HALF_UP,
BigDecimal.ROUND_HALF_UPpublic static BigDecimal setScale(Number value, int scale, RoundingMode roundingMode)
roundingMode 来设置小数点位数.
NumberUtil.setScale(5, 5,HALF_UP) = toBigDecimal("5.00000")
NumberUtil.setScale(5.2, 3,HALF_UP) = toBigDecimal("5.200")
NumberUtil.setScale(5.26, 1,HALF_UP) = toBigDecimal("5.3")
NumberUtil.setScale(-5.26, 1,HALF_UP) = toBigDecimal("-5.3")
NumberUtil.setScale(-0, 1,HALF_UP) = toBigDecimal("0.0")
NumberUtil.setScale(0, 1,HALF_UP) = toBigDecimal("0.0")
NumberUtil.setScale(0, 2,HALF_UP) = toBigDecimal("0.00")
NumberUtil.setScale(5, 5,null) = toBigDecimal("5.00000")
NumberUtil.setScale(5.2, 3,null) = toBigDecimal("5.200")
NumberUtil.setScale(5.26, 1,null) = toBigDecimal("5.3")
NumberUtil.setScale(-5.26, 1,null) = toBigDecimal("-5.3")
NumberUtil.setScale(-0, 1,null) = toBigDecimal("0.0")
NumberUtil.setScale(0, 1,null) = toBigDecimal("0.0")
NumberUtil.setScale(0, 2,null) = toBigDecimal("0.00")
value - numberscale - 标度,小数的位数,四舍五入,用于 BigDecimal.setScale(int, RoundingMode)roundingMode - 舍入模式RoundingMode,如果 为null,使用常用的 RoundingMode.HALF_UPvalue 是null,抛出 NullPointerExceptionroundingMode是null,使用常用的 RoundingMode.HALF_UP Copyright © 2008-2019 by feilong