有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在BigDecimal上下文中,用小整数值初始化的双精度能否准确地使用?

有充分的证据表明,使用双精度会导致不准确,而BigDecimal可以保证准确性,只要混合中没有双精度

然而,如果所讨论的双精度是一个小整数,那么精度有保证吗

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

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

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

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

假设小整数倍与大小数一起使用是安全的吗?如果是,会导致不准确的最小整数是什么

>>;回复初始答案的其他信息:

谢谢你的回答。非常有帮助

只是想补充一点细节,我有一个传统的接口,它提供了双精度,但我可以确定,这些双精度将表示通过双精度从字符串转换为双精度的整数。parseDouble(字符串),其中字符串是保证的整数表示形式

如果可以避免的话,我不想创建一个传递字符串或大小数的新接口

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

考虑到在我最初的示例中,使用0.1d并不能准确地得到0.1,如实际的BigDecimal为0.10000000000000055551151231257827021181583404541015625这一事实所示,一些分数似乎会引入不精确性

另一方面,在我最初的例子中,使用1.0d确实准确地得到了1,因此似乎整数保持了准确性。如果我正确理解了你的答案,那么这个值可以保证达到2^53

这是正确的假设吗


共 (1) 个答案

  1. # 1 楼答案

    简短的回答是否定的。由于浮点变量存储在内存中的方式,没有“小”值0.000001使用与100000相同的位数,每个值都以相同的方式表示0。xxx。。艾伊

    初始化BigDecimal的更好方法是用字符串初始化它

    BigDecimal bdDouble = new BigDecimal("0.1");