首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BigDecimal - MathContext.DECIMAL64对MathContext.DECIMAL128

BigDecimal - MathContext.DECIMAL64对MathContext.DECIMAL128
EN

Stack Overflow用户
提问于 2018-05-09 02:26:13
回答 1查看 4.7K关注 0票数 1

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-09 02:55:33

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

支持在-6143和+6144之间的指数;decimal128有34位数(即decimal128)

数列为+-0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

我们可以发现,差别是范围。

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

示例:

代码语言:javascript
复制
    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);
}

输出:

代码语言:javascript
复制
0.3333333
0.3333333333333333
0.3333333333333333333333333333333333
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

因此,如果您想要更大范围的结果,您应该使用decimal128或无限(但注意无限循环十进制,它会抛出ArithmeticException),否则,您应该使用decimal64或decimal32,因为更大的范围意味着较差的性能。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50244659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档