gpt4 book ai didi

java - 为什么 bigDecimal 的 scale() 方法在与 stripTrailingZeros() 方法结合时返回负值?

转载 作者:太空狗 更新时间:2023-10-29 14:36:08 25 4
gpt4 key购买 nike

为了避免 BigDecimal 出现 10.0000 这样的值,我使用了 stripTrailingZeros() 方法,该方法返回值 10 而不是预期的 10.0000。现在,10 的小数位数应该为 0,因为对于零值或正值,小数位数是小数点右边的位数。然而,情况并非如此,因为它返回 -1。

Log.d("click", BigDecimal("10").toPlainString()) // return 10
Log.d("click", BigDecimal("10").stripTrailingZeros().toPlainString()) // return 10

上面的代码返回,相同的值 10 和 stripTrailingZeros() 对其值没有影响。

Log.d("click", BigDecimal("10").scale().toString())  // return 0
Log.d("click", BigDecimal("10").stripTrailingZeros().scale().toString()) // return -1

但是这些值的比例是不同的,因为它返回 0 和 -1 以及

Log.d("click", BigDecimal("100").stripTrailingZeros().scale().toString()) // return -2
Log.d("click", BigDecimal("1000").stripTrailingZeros().scale().toString()) // return -3

有什么方法可以获得我预期的结果吗?谁能解释为什么 scale() 方法返回负值?

最佳答案

这取决于 BigDecimal 的存储方式。它使用刻度来记住小数位数。

unscaledValue 和 scale

Bigdecimals 可以记住它拥有的小数位数(位于小数点分隔符后面)。为此,它们被存储为两个值:

  • unscaledValue(通常是 BigInteger,但对于小值,这也可能很长)包含(有效)数字和
  • scale(10 的次方乘以 unscaledValue 得到标称值,即一种负指数)。

示例:值 1.0 存储为 10 的 UnscaledValue(我称之为 UV)和 1 的比例(10 x 10-1)。值 3.000 存储为 3000 的 UV 和 3 的比例(3000 x 10-3),12.34 为 UV=1234 和 scale=2(即 1234 x 10-2),依此类推。

您的值 10 存储为 UV=10 和 scale=0(简称:UV=10,s=0)。但是如果你去掉尾随的零,你转换例如1.000 (UV=1000, S=3) 从 UV 中去除试验零并相应地调整比例,所以它变成 (UV=1, S=0):UV 失去 3 个零,比例调整为0。

也可以使用负标度,表示 10 的()次方。值 2e20 存储为 UV=2, s=-20 (2 x 1020),而不是 UV=200000000000000000000,s=0。这样可以节省很多空间。同样,2.00e20 存储为 UV=200、s=-18 或 200 x 1018

这就是为什么当删除尾随零时,10 变为 UV=1,s=-1 (1 x 101) ,而不是 UV=10,s=0 (10 x 100)。而6000 (UV=6000, s=0) 变成6E+3 (UV=6, s=-3; 6 x 103).

设置比例

但是您可以轻松地将刻度设置回 0 而无需更改标称值。如果比例为负,则不会进行四舍五入。

BigDecimal b1 = new BigDecimal("10.000"); // UV=10000, s=3, 10000 x 10**-3
System.out.println(b1);
b1 = b1.stripTrailingZeros(); // UV=1, s=-1, *all* trailing zeros removed,
// as desired: 10000 --> 1
System.out.println(b1);
b1 = b1.setScale(0); // UV=10, s=0
System.out.println(b1);

输出:

10.000
1E+1
10

因此,要仅去除尾随的小数零,请执行以下操作:

b1 = b1.stripTrailingZeros();
if (b1.scale() < 0)
b1 = b1.setScale(0);

关于java - 为什么 bigDecimal 的 scale() 方法在与 stripTrailingZeros() 方法结合时返回负值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55508186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com