BigDecimal - MathContext.DECIMAL64 vs MathContext.DECIMAL128

时间:2018-05-09 02:26:13

标签: java bigdecimal

我正在处理货币价值之间的分歧。我目前正在使用MathContext.DECIMAL128作为BigDecimal.divide()的第二个参数。我应该使用MathContext.DECIMAL128还是MathContext.DECIMAL64

1 个答案:

答案 0 :(得分:-1)

decimal32,decimal64和decimal128之间的区别是(来自https://bloomberg.github.io/comdb2/decimals.html):

decimal32支持介于-95和+96之间的指数;有效数字有7位数(即0.000000-9.999999)。

此格式可表示的数字范围为+ -0.000000x10-95至+ -9.999999x10 + 96

decimal64支持-383到+384之间的指数;有效数字有16位数(即0.000000000000000-9.999999999999999)。数字范围是+ -0.000000000000000x10-383到+ -9.999999999999999x10 + 384

decimal128支持-6143和+6144之间的指数;有效数字有34位数(即0.000000000000000000000000000000000-9.999999999999999999999999999999999)。

数字范围为+ -0.000000000000000000000000000000000x10-6143至+ -9.999999999999999999999999999999999x10 + 6144

我们可以发现差异是范围。

BigDecimal支持特殊的舍入模式:UNLIMITED,但如果我们使用UNLIMITED, 无限循环十进制结果将抛出ArithmeticException。

示例:

    public static void main(String[] args) {
    BigDecimal bd = new BigDecimal(1);
    BigDecimal bd2 = new BigDecimal(3);

    BigDecimal result = bd.divide(bd2, MathContext.DECIMAL32);
    System.out.println(result);
    result = bd.divide(bd2, MathContext.DECIMAL64);
    System.out.println(result);
    result = bd.divide(bd2, MathContext.DECIMAL128);
    System.out.println(result);
    result = bd.divide(bd2, MathContext.UNLIMITED);
    System.out.println(result);
}

输出:

0.3333333
0.3333333333333333
0.3333333333333333333333333333333333
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

所以,如果你想要更大范围的结果,你应该使用decimal128或UNLIMITED(但要注意无限循环小数,它会抛出ArithmeticException),否则,你应该使用decimal64或decimal32,因为更大的范围意味着更差的性能。