分享知识 传递快乐
简介
Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算。Float和Double只能用来做科学计算或者是工程计算;在金融计算中,对数字精度要求较高,必须使用 BigInteger 类和 BigDecimal 类,它支持任何精度的定点数,可以用它来精确计算货币值。使用此类可以完成大的小数操作,而且也可以使用此类进行精确的四舍五入,这一点在开发中经常使用。对于不需要任何准确计算精度的程序可以直接使用float或double完成,但是如果需要精确计算结果,则必须使用BigDecimal类。
BigDecimal类常用方法
BigDecimal(String val):将String类型转换成BigDecimal类型数据(推荐使用)
BigDecimal(double val):将double类型转换成BigDecimal类型数据(不推荐使用)
BigDecimal valueOf(<T> t):将<T>类型转换成BigDecimal类型数据(推荐使用)
BigDecimal(int val):将int类型转换成BigDecimal类型数据
BigDecimal add(BigDecimal value):加法,求两个BigDecimal类型数据的和
BigDecimal subtract(BigDecimal value):减法,求两个BigDecimal类型数据的差
BigDecimal multiply(BigDecimal value):乘法,求两个BigDecimal类型数据的积
BigDecimal divide(BigDecimal divisor):除法,求两个BigDecimal类型数据的商
BigDecimal remainder(BigDecimal divisor):求余数,求BigDecimal类型数据除以divisor的余数
BigDecimal max(BigDecimal value):最大数,求两个BigDecimal类型数据的最大值
BigDecimal min(BigDecimal value):最小数,求两个BigDecimal类型数据的最小值
BigDecimal abs():绝对值,求BigDecimal类型数据的绝对值
BigDecimal negate():相反数,求BigDecimal类型数据的相反数
这里要注意除法 divide 运算,BigDecimal除法可能出现不能整除的情况,比如 10.4/3.3,这时会报错:
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide(BigDecimal.java:1693)
divide 运算方法:
BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
第一参数表示除数。
第二个参数表示小数点后保留位数。
第三个参数表示舍入模式。只有在作除法运算或四舍五入时才用到舍入模式。
舍入模式有以下几种:
ROUND_CEILING:向正无穷方向舍入
ROUND_DOWN:向零方向舍入
ROUND_FLOOR:向负无穷方向舍入
ROUND_HALF_DOWN:向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5
ROUND_HALF_EVEN:向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位 ?数是奇数,使用ROUND_HALF_UP:如果是偶数,使用ROUND_HALF_DOWN
ROUND_HALF_UP:向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55 保留一位小数结果为1.6
ROUND_UNNECESSARY:计算结果是精确的,不需要舍入模式
ROUND_UP:向远离0的方向舍入
注意
1. double参数的构造方法,不允许使用!因为它不能精确的得到相应的值,值会变大;
2. String构造方法是完全可预知的:写入newBigDecimal("0.1")将创建一个BigDecimal,它正好等于预期的0.1;因此,通常建议优先使用String构造方法;
3. 静态方法valueOf(doubleval)内部实现,仍是将double类型转为String类型;
4. BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值。
————————————
如有不妥之处请留言指正。
相互学习,共同进步。