java - 可以在 BigDecimal 上下文中准确地使用用小整数值初始化的 double 吗?

标签 java double bigdecimal

有据可查的是,使用 double 会导致不准确,只要混合中没有 double ,BigDecimal 就能保证精度。

但是,如果所讨论的 double 是一个小整数,是否可以保证准确性?

例如,尽管以下内容不准确/不安全:

BigDecimal bdDouble = new BigDecimal(0.1d); // 0.1000000000000000055511151231257827021181583404541015625

以下内容是否始终准确/安全?

BigDecimal bdDouble = new BigDecimal(1.0d); // 1

可以安全地假设使用 BigDecimals 可以安全地使用小整数 double - 如果是这样,会导致不准确的最小整数是多少?

>> 针对初始答案的附加信息:

感谢您的回答。很有帮助。

只是为了添加更多细节,我有一个提供 double 的旧接口(interface),但我可以肯定这些 double 将代表整数,它们本身通过 Double.parseDouble(String) 从字符串转换为 double ,其中 String是有保证的整数表示。

如果可以避免,我不想创建一个向我传递字符串或 BigDecimals 的新接口(interface)。

我可以在我这边的接口(interface)上立即将 double 转换为 BigDecimal,并使用 BigDecimal 调用进行所有内部计算,但我想确保这与创建新的 BigDecimal/String 接口(interface)一样安全。

鉴于在我原来的例子中使用 0.1d 并不能准确地得到 0.1,正如实际 BigDecimal 是 0.1000000000000000055511151231257827021181583404541015625 所表明的那样,似乎某些分数会引入不准确。

另一方面,考虑到在我使用 1.0d 的原始示例中确实准确地得到了 1,看起来整数保持了准确性。如果我正确理解您的答案,这似乎可以保证达到 2^53 的值。

这是一个正确的假设吗?

最佳答案

BigDecimal 方面与这个问题的相关性不如“可以用 double 精确表示的整数范围是多少?” - 因为每个有限的 double 值都可以用 BigDecimal 精确表示,这就是您调用 BigDecimal(double) 时将获得的值> 构造函数。因此,您可以确信,如果您希望表示的值是一个可以用 double 精确表示的整数,如果您将 double 传递给 BigDecimal 构造函数,您将得到一个 BigDecimal,它完全代表相同的整数。

double 的有效位数是 52 位。由于归一化,这意味着您应该能够准确存储 [-253, 253] 范围内的整数值。这些都是相当大的数字。

当然,如果您只从事表示整数的业务,那么您为什么要使用 double 就值得怀疑了……并且您需要确保您进行的任何转换从原始源数据到 double 的使用不会丢失任何信息 - 但纯粹是关于“什么范围的整数可以完全表示为 double 值”我相信以上是正确的...

关于java - 可以在 BigDecimal 上下文中准确地使用用小整数值初始化的 double 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29749496/

相关文章:

java - 配置速度以使用 toString 以外的东西渲染对象?

java - 确定 PermGen 空间中单个 Java 类定义的大小?

java - 如何使用 Android NDK 构建 Platinum UPnP 堆栈?

java - 从 double 转换为 String 但保留前导零

Java 使用 BigDecimal 除法

javascript - 如何使用 Frida 迭代函数

c++ - 小数输出后加两个零

bash - 由于用空格扩展变量导致的 Grep 错误

java - 强制 BigDecimals 使用科学计数法

java - 我们可以用 BigDecimal 完全替换使用 Double 吗,有任何性能开销吗?