Mr.*_*ike 5 java double bigdecimal
有充分证据表明,使用double会导致不准确,只要混合中没有双打,BigDecimal就能保证准确性.
但是,如果双重问题是一个小的整数,是否保证了准确性?
例如,虽然以下内容不准确/不安全:
BigDecimal bdDouble = new BigDecimal(0.1d); // 0.1000000000000000055511151231257827021181583404541015625
Run Code Online (Sandbox Code Playgroud)
以下内容总是准确/安全吗?
BigDecimal bdDouble = new BigDecimal(1.0d); // 1
Run Code Online (Sandbox Code Playgroud)
假设使用BigDecimals可以安全地使用小的整数双打是否安全 - 如果是这样,引入不准确性的最小整数是多少?
>>回复初步答案的其他信息:
谢谢你的回答.很有帮助.
只是为了添加更多细节,我有一个提供双打的遗留接口,但我可以肯定这些双打将代表整数,它们自己通过Double.parseDouble(String)从Strings转换为double,其中String是保证的整数表示.
如果我可以避免它,我不想创建一个新的接口,它传递我的字符串或BigDecimals.
我可以立即将double转换为我接口上的BigDecimal,并使用BigDecimal调用进行所有内部计算,但我想确保它与创建新的BigDecimal/String接口一样安全.
鉴于在我的原始示例中使用0.1d并不能准确地得出0.1,如实际BigDecimal为0.1000000000000000055511151231257827021181583404541015625这一事实所示,似乎某些分数会引入不准确性.
另一方面,鉴于在我的原始示例中使用1.0d确实准确地得到1,看起来整数保持准确性.如果我正确理解你的答案,似乎保证最高值为2 ^ 53.
这是正确的假设吗?
这个BigDecimal方面与这个问题没有关系,因为"可以准确表示的整数范围是double多少?" - 因为每个有限double值都可以精确地表示BigDecimal,并且这是你调用BigDecimal(double)构造函数时得到的值.因此,您可以确信,如果您希望表示的值是一个可由a精确表示的整数double,如果将其传递double给BigDecimal构造函数,您将得到一个BigDecimal精确表示相同整数的值.
a的有效double位数是52位.由于归一化,这意味着你应该期望能够整数值存储在范围[-2 53,2 53 ]确切地.这些都是非常大的数字.
当然,如果您只是在表示整数的业务,那么您使用它的原因是值得怀疑的double......并且您需要确保您从原始源数据使用的任何转换double都不是失去任何信息损失 - 但纯粹基于"什么范围的整数可以完全代表double价值"的问题我相信以上是正确的...