
BigDecimal的由来
由于互联网金额的高发达和高统一性,关于货币的金额基本都是精确到分,因此double在货币计算中可以说用武之地比较小,Java提供了一个非常强大的货币金额计算工具:BigDecimal
BigDecimal的基本使用
==如果需要进行精确计算,务必将对应数字转化为String来构造BigDecimal==
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 
 | public static void main(String[] args) {double a = 10.1234;
 double b = 5.3134;
 BigDecimal bigDecimalA = new BigDecimal(String.valueOf(a));
 BigDecimal bigDecimalB = new BigDecimal(String.valueOf(b));
 
 
 
 double addValue = bigDecimalA.add(bigDecimalB).doubleValue();
 
 
 
 
 double subtractValue = bigDecimalA.subtract(bigDecimalB).doubleValue();
 
 
 
 
 double multiplyValue = bigDecimalA.multiply(bigDecimalB).doubleValue();
 
 
 
 int scale = 2;
 double divideValue = bigDecimalA.divide(bigDecimalB, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
 
 
 
 
 int num = new BigDecimal("2019.1027")
 .divide(new BigDecimal("4.10"), scale, BigDecimal.ROUND_HALF_UP)
 .multiply(new BigDecimal("1024"))
 .add(new BigDecimal("1234")).intValue();
 }
 
 | 
BigDecimal计算结果精度的控制
- ROUND_UP 舍入远离零的舍入模式:在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。 
- ROUND_DOWN 接近零的舍入模式:在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。 
- ROUND_CEILING 接近正无穷大的舍入模式:如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;如果为负,则舍入模式与ROUND_DOWN相同。 
- ROUND_FLOOR 接近负无穷大的舍入模式:如果BigDecimal 为负,则舍入行为ROUND_DOWN相同;反之亦然。 
- ROUND_HALF_UP  四舍五入:向最接近的数字舍入,如果为5及以上则同样进一;5以下舍弃。 
- ROUND_HALF_DOWN 五舍六入:向最接近的数字舍入,如果为6及以上则进一,6以下舍弃。 
- ROUND_HALF_EVEN   向“最接近的”数字舍入:如果与两个相邻数字的距离相等,则向相邻的偶数舍入: 如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。示例: 保留小数点后1位,则:1.15 -> 1.2;1.25 ->1.2 
- ROUND_UNNECESSARY 断言请求的操作具有精确的结果,因此不需要舍入:如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。 
  在以上的精确控制中,比较常用的是ROUND_HALF_UP和 ROUND_HALF_EVEN  ;互联网计算精度最最常用的是ROUND_HALF_EVEN。
double数据的常用格式化
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 
 | public static void main(String[] args) {
 double num = 1834234847.2345;
 
 
 
 
 String value = NumberFormat.getNumberInstance().format(num);
 
 
 
 
 value = NumberFormat.getIntegerInstance().format(num);
 
 
 
 
 NumberFormat currency = NumberFormat.getCurrencyInstance();
 
 currency.setMinimumFractionDigits(2);
 
 currency.setMaximumFractionDigits(4);
 value = currency.format(num);
 
 
 
 NumberFormat percent = NumberFormat.getPercentInstance();
 
 percent.setMinimumFractionDigits(2);
 
 percent.setMaximumFractionDigits(3);
 value = percent.format(num);
 }
 
 |