java.math包下BigDecimal的使用
为什么使用 BigDecimal
在日常开发中我们经常会碰到小数计算,而小数直接计算的话会出现一些小小的错误,如下
这是因为不论是 float 还是 double 都是浮点数,他们执行二进制浮点运算
而计算机是二进制的,浮点数会失去一定的精确度
所以 float 和 double 只能用来做科学计算或者是工程计算
所以如果需要精确的答案,请避免使用 float 和 double,尤其是在涉及到货币计算的时候一定要使用 BigDecimal
关于 BigDecimal
Java 在java.math
包中提供的API
类BigDecimal
,用来对超过 16 位有效位的数进行精确的运算。
BigDecimal
所创建的是对象,我们不能使用传统的 +
、-
、*
、/
等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是 BigDecimal 的对象。
构造器描述
构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。
- BigDecimal(int): 创建一个具有参数所指定整数值的对象
- BigDecimal(double): 创建一个具有参数所指定双精度值的对象
- BigDecimal(long): 创建一个具有参数所指定长整数值的对象
- BigDecimal(String): 创建一个具有参数所指定以字符串表示的数值的对象
方法描述
- add(BigDecimal): BigDecimal 对象中的值相加,然后返回这个对象
- subtract(BigDecimal): BigDecimal 对象中的值相减,然后返回这个对象
- multiply(BigDecimal): BigDecimal 对象中的值相乘,然后返回这个对象
- divide(BigDecimal): BigDecimal 对象中的值相除,然后返回这个对象
- doubleValue(): 将 BigDecimal 对象中的值以双精度数返回
- floatValue(): 将 BigDecimal 对象中的值以单精度数返回
- longValue(): 将 BigDecimal 对象中的值以长整数返回
- intValue(): 将 BigDecimal 对象中的值以整数返回
- setScale(): 格式化小数点
BigDecimal 的创建
1 | public class Demo { |
区别
加减乘除
1 | public class Demo { |
BigDecimal 保留 N 位小数
BigDecimal.setScale(); 方法用于格式化小数点,可以自定义处理方式。
ROUND_DOWN
向零方向舍入
1 | // 3.141 |
ROUND_UP
向远离 0 的方向舍入
1 | // 3.142 |
ROUND_CEILING
向正无穷方向舍入
1 | // 3.142 |
ROUND_FLOOR
向负无穷方向舍入
1 | // 3.141 |
ROUND_UNNECESSARY
计算结果是精确的,不需要舍入模式
1 | // 3.141 |
本文采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ShiGuang
评论