创建 BigDecimal 时,precision 和 setScale 之间有什么关联?

What is the correlation between precision and setScale when creating a BigDecimal?

提问人:generic_name_ryan 提问时间:6/22/2020 更新时间:6/22/2020 访问量:35

问:

我了解到精度是值中的总位数,小数位数是小数点后的位数。 因此,据我了解,数字 1234.56 的精度 = 6 和小数位数 = 2。

我还看到,当您使用 MathContext 定义精度,然后创建一个精度大于定义的 BigDecimal 时,输出会被转换,例如

    MathContext mc = new Mathcontext (6) 
    BigDecimal bd = new BigDecimal ("1234567", mc)
    System.out.println(bd);
    //bd is printed as 1.23457E+6

但是,当我在创建 BigDecimal 时添加 setScale 时,无论 MathContext 中定义的精度如何,BigDecimal 都会正确打印,例如

    MathContext mc = new Mathcontext (6) 
    BigDecimal bd = new BigDecimal ("1234567", mc).setScale(1)
    System.out.println(bd);
    //bd is printed as 12345670.0

为什么它将 BigDecimal 显示为 12345670.0,精度 = 9?还值得担心吗?我可以想象它可能只是一些意想不到的效果,背后没有任何规则/逻辑,但我很好奇我可能错过了什么。

Java 小数位数 精度 Bigdecimal

评论

0赞 Amongalen 6/22/2020
对我来说,第二个片段打印.它失去了一些精确度 - 它被四舍五入了。设置刻度基本上会强制它显示我能看出的小数位。1234570.0
0赞 Pierre Demeestere 11/16/2022
new BigDecimal ("1234567", mc)创建一个具有 6 位有效数字的数字(可以显示为 1.23457E+07 或 1234570)。这是一个精度 = 6 且小数位数 = -1 的 BigDecimal。这种负小数位数意味着小数点右侧的第一个数字等于 0。然后,当您将此 BigDecimal 的小数位数从 -1 更改为 1 时,它认为此 BigDecimal 现在表示小数点右侧具有有效数字的值。而且,显然这个数字是空的,那么值变为 1234570.0

答: 暂无答案