gpt4 book ai didi

java - BigDecimal 适用于大数

转载 作者:行者123 更新时间:2023-12-01 17:58:40 24 4
gpt4 key购买 nike

我试图理解 BigDecimal 的比例,但它的行为很奇怪,我不明白为什么。这里有几个例子:

Double d = new Double(1000000d);
int scale = new BigDecimal(d.toString()).scale();

本例中的比例为 1,这对我来说是正确的。d.toString() 的结果是“1000000.0”。

Double d = new Double(10000000d);
int scale = new BigDecimal(d.toString)).scale();

此示例中的比例将为 -6。谁能解释为什么?d.toString() 的结果是“1.0E7”。

我认为是位数造成的,但如果我去:

Double d = new Double(11111111d);
int scale = new BigDecimal(d.toString()).scale();

预计比例为 -8,但突然变成了 0。d.toString() 的结果是“1.1111111E7”。

在阅读了scale()的Javadoc之后,这些不同的比例对我来说毫无意义:

Returns the scale of this BigDecimal. If zero or positive, the scale is the number of digits to the right of the decimal point. If negative, the unscaled value of the number is multiplied by ten to the power of the negation of the scale. For example, a scale of -3 means the unscaled value is multiplied by 1000.

我非常感谢您解释当数字很大时 BigDecimal 的行为。

提前致谢!

最佳答案

您得到的刻度是小数位数具有一定意义:

  • 1000000d -> 1000000.0 -> 0:点右边的数字没有意义,结果为0;
  • 10000000d -> 1.0E7 -> -6:点右侧的数字具有重要意义,就好像您将幂乘以 10 进行非规范化,您会得到 6 个零;
  • 11111111d -> 1.1111111E7 -> 0:点右侧的所有数字都有意义,将幂乘以 10 进行非标准化,您会获得更多信息,因此如果您想保留此数字,则“无法”标准化该数字信息。这样(数字非规范化),点右侧就有 0 个数字。

编辑

正如评论所述,第一行是错误的,它必须是1000000d -> 1000000.0 -> 1。原因是指数数字与格式化数字具有不同的行为(在获取比例时)。

1 的值是由于 BigDecimal 计算点右侧的数字(在本例中为 1,单个 0),减去要删除的数字(在本例中只有一个,即单个 0)并添加数学精度(默认为 1)-> 结果 = 1。

关于java - BigDecimal 适用于大数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42628123/

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