BigDecimal相关总结
package bigDecimal;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
public class Test {
public static void main(String[] args) {
// 构造方法
System.out.println("=========构造方法=========");
System.out.println(new BigDecimal(1));
System.out.println(new BigDecimal("1"));
System.out.println(new BigDecimal("1.2"));
// 不推荐使用
System.out.println(new BigDecimal(1.2));
System.out.println(BigDecimal.valueOf(1.2));
System.out.println(new BigDecimal(1L));
// 格式化
System.out.println("=========格式化=========");
// 货币格式化
NumberFormat currencyInstance = NumberFormat.getCurrencyInstance(Locale.GERMAN);
System.out.println(currencyInstance.format(new BigDecimal("128000000.00")));
// 百分数格式化
NumberFormat percentInstance = NumberFormat.getPercentInstance();
percentInstance.setMaximumFractionDigits(8);
System.out.println(percentInstance.format(new BigDecimal("0.000008")));
// 数据位数格式化
DecimalFormat format1 = new DecimalFormat("000.00");
System.out.println(format1.format(new BigDecimal("36.2356")));
DecimalFormat format2 = new DecimalFormat("###.##");
System.out.println(format2.format(new BigDecimal("36.2356")));
// 精度
BigDecimal p = new BigDecimal("3.335");
// 向0靠拢
System.out.println("=========RoundingMode.DOWN向0靠拢=========");
System.out.println(p.setScale(2, RoundingMode.DOWN));
System.out.println(p.negate().setScale(2, RoundingMode.DOWN));
// 远离0
System.out.println("=========BigDecimal.ROUND_UP远离0=========");
System.out.println(p.setScale(2, BigDecimal.ROUND_UP));
System.out.println(p.negate().setScale(2, BigDecimal.ROUND_UP));
// 靠近正无穷
System.out.println("=========RoundingMode.CEILING靠近正无穷=========");
System.out.println(p.setScale(2, RoundingMode.CEILING));
System.out.println(p.negate().setScale(2, RoundingMode.CEILING));
// 靠近负无穷
System.out.println("=========BigDecimal.ROUND_FLOOR靠近负无穷=========");
System.out.println(p.setScale(2, BigDecimal.ROUND_FLOOR));
System.out.println(p.negate().setScale(2, BigDecimal.ROUND_FLOOR));
// 四舍五入
System.out.println("=========BigDecimal.ROUND_HALF_UP四舍五入=========");
System.out.println(p.setScale(2, BigDecimal.ROUND_HALF_UP));
System.out.println(p.negate().setScale(2, BigDecimal.ROUND_HALF_UP));
// 五舍六入
System.out.println("=========BigDecimal.ROUND_FLOOR五舍六入=========");
System.out.println(p.setScale(2, BigDecimal.ROUND_HALF_DOWN));
System.out.println(p.negate().setScale(2, BigDecimal.ROUND_HALF_DOWN));
// 银行家舍入法,四舍六入,五看情况(靠近偶数)
System.out.println("=========BigDecimal.ROUND_FLOOR银行家舍入法=========");
System.out.println(p.setScale(2, BigDecimal.ROUND_HALF_EVEN));
System.out.println(p.negate().setScale(2, BigDecimal.ROUND_HALF_EVEN));
// 断言不需要舍入,否则报错
System.out.println("=========BigDecimal.ROUND_UNNECESSARY断言不需要舍入=========");
System.out.println(p.setScale(3, BigDecimal.ROUND_UNNECESSARY));
try {
p.setScale(2, BigDecimal.ROUND_UNNECESSARY);
} catch (Exception e) {
// java.lang.ArithmeticException: Rounding necessary
System.out.println(e.toString());
}
// 运算
System.out.println("=========运算=========");
BigDecimal a = new BigDecimal("10");
BigDecimal b = new BigDecimal("3");
// 加
System.out.println(a + " + " + b + " = " + a.add(b));
System.out.println("经过计算a的值不改变,a = " + a);
// 减
System.out.println(a + " - " + b + " = " + a.subtract(b));
// 乘
System.out.println(a + " × " + b + " = " + a.multiply(b));
// 除
System.out.println(a + " ÷ " + b + " = " + a.divide(b, 2, RoundingMode.HALF_UP));
// 余数
System.out.println(a + " ÷ " + b + " 余 " + a.remainder(b));
// 商和余数
System.out.println(a + " ÷ " + b + " = " + a.divideAndRemainder(b)[0] + " ... " +a.divideAndRemainder(b)[1]);
// 幂运算
System.out.println(new BigDecimal("2").pow(10));
System.out.println(new BigDecimal("2.0").pow(10));
System.out.println(new BigDecimal("2.1").pow(10));
// 位数
System.out.println("3.33的位数: " +a.divide(b, 2, RoundingMode.HALF_UP).precision());
// 小数位数
System.out.println("3.33的小数位数: " + a.divide(b, 2, RoundingMode.HALF_UP).scale());
// 正负号
System.out.println("4876的符号是:" + new BigDecimal("4876").signum());
System.out.println("-4876的符号是:" +new BigDecimal("-4876").signum());
// 比较大小
System.out.println("a > b: " + a.compareTo(b));
BigDecimal samllA = new BigDecimal("0.000000000001");
BigDecimal smallB = new BigDecimal("0.0000000000002");
System.out.println("samllA > smallB: " + samllA.compareTo(smallB));
// 相反数
System.out.println(a.negate());
// 绝对值
System.out.println(new BigDecimal("-96").abs());
// 最大值
System.out.println("最大值:" + a.max(b).max(new BigDecimal("100.2")));
// 最小值
System.out.println("最小值:" + a.min(b));
// 判断是否相等
System.out.println(new BigDecimal("1236.5").equals(new BigDecimal("1236.5")));
System.out.println(new BigDecimal("1236.5").equals(new BigDecimal("1236.8")));
// hash值
System.out.println(new BigDecimal("73246598").hashCode());
// 移动小数点,相当于缩放10的倍数
System.out.println("88小数点左移3位:" + new BigDecimal("88").movePointLeft(3));
System.out.println("88小数点右移3位:" + new BigDecimal("88").movePointRight(3));
System.out.println(new BigDecimal("22").plus().plus());
// 刻度值,最小单位
System.out.println("156.963的刻度值:" + new BigDecimal("156.963").ulp());
System.out.println("1560的刻度值:" + new BigDecimal("1560").ulp());
// 结果转换
System.out.println("=========结果转换=========");
System.out.println(a.intValue());
System.out.println(a.doubleValue());
System.out.println(a.floatValue());
System.out.println(a.longValue());
System.out.println(a.toString());
// 基本常量
System.out.println("=========基本常量=========");
System.out.println("BigDecimal.ZERO = " + BigDecimal.ZERO);
System.out.println("BigDecimal.ONE = " + BigDecimal.ONE);
System.out.println("BigDecimal.TEN = " + BigDecimal.TEN);
/**
* 总结:
* (1)商业计算使用BigDecimal。
* (2)尽量使用参数类型为String的构造函数。
* (3) BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值。
* (4)我们往往容易忽略JDK底层的一些实现细节,导致出现错误,需要多加注意。
*/
}
}
控制台输出
=========构造方法=========
1
1
1.2
1.1999999999999999555910790149937383830547332763671875
1.2
1
=========格式化=========
¤ 128.000.000,00
0.0008%
036.24
36.24
=========RoundingMode.DOWN向0靠拢=========
3.33
-3.33
=========BigDecimal.ROUND_UP远离0=========
3.34
-3.34
=========RoundingMode.CEILING靠近正无穷=========
3.34
-3.33
=========BigDecimal.ROUND_FLOOR靠近负无穷=========
3.33
-3.34
=========BigDecimal.ROUND_HALF_UP四舍五入=========
3.34
-3.34
=========BigDecimal.ROUND_FLOOR五舍六入=========
3.33
-3.33
=========BigDecimal.ROUND_FLOOR银行家舍入法=========
3.34
-3.34
=========BigDecimal.ROUND_UNNECESSARY断言不需要舍入=========
3.335
java.lang.ArithmeticException: Rounding necessary
=========运算=========
10 + 3 = 13
经过计算a的值不改变,a = 10
10 - 3 = 7
10 × 3 = 30
10 ÷ 3 = 3.33
10 ÷ 3 余 1
10 ÷ 3 = 3 ... 1
1024
1024.0000000000
1667.9880978201
3.33的位数: 3
3.33的小数位数: 2
4876的符号是:1
-4876的符号是:-1
a > b: 1
samllA > smallB: 1
-10
96
最大值:100.2
最小值:3
true
false
-2024322758
88小数点左移3位:0.088
88小数点右移3位:88000
22
156.963的刻度值:0.001
1560的刻度值:1
=========结果转换=========
10
10.0
10.0
10
10
=========基本常量=========
BigDecimal.ZERO = 0
BigDecimal.ONE = 1
BigDecimal.TEN = 10
Process finished with exit code 0