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.2
1.25 返回 1.2
RoundingMode.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,抛出 NullPointerException
two
是null,抛出 NullPointerException
public 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,抛出 NullPointerException
two
是null,抛出 NullPointerException
public 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,抛出 NullPointerException
two
是null,抛出 NullPointerException
public 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,抛出 NullPointerException
two
是null,抛出 NullPointerException
public 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,抛出 NullPointerException
two
是null,抛出 NullPointerException
public 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,抛出 NullPointerException
two
是 null,抛出 NullPointerException
two
是 0,抛出 IllegalArgumentException
BigDecimal
返回除法结果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
- 舍入法 RoundingMode
one
是 null,抛出 NullPointerException
two
是 null,抛出 NullPointerException
two
是 0,抛出 IllegalArgumentException
BigDecimal
返回除法结果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,抛出 NullPointerException
two
是 null,抛出 NullPointerException
BigDecimal
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,抛出 NullPointerException
numbers
是empty,抛出 IllegalArgumentException
IllegalArgumentException
BigDecimal
,并进行累加操作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,抛出 NullPointerException
subtractions
是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
- 转成字符串格式 NumberPattern
value
是null,抛出 NullPointerException
toStringPattern
是null,抛出 NullPointerException
toStringPattern
是blank,抛出 IllegalArgumentException
NumberFormatUtil.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
- 转成字符串格式 NumberPattern
current
是null,抛出 NullPointerException
total
是null,抛出 NullPointerException
current <= 0
,抛出 IllegalArgumentException
total <= 0
,抛出 IllegalArgumentException
current > total
,抛出 IllegalArgumentException
toStringPattern
是null,抛出 NullPointerException
toStringPattern
是blank,抛出 IllegalArgumentException
NumberPattern
,
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,抛出 NullPointerException
RoundingMode.HALF_UP
,
BigDecimal.ROUND_HALF_UP
public 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_UP
value
是null,抛出 NullPointerException
roundingMode
是null,使用常用的 RoundingMode.HALF_UP
Copyright © 2008-2019 by feilong