如果不对金额进行任何操作,BigDecimal.doubleValue() 的准确度如何

abd*_*nno 5 java precision double soap bigdecimal

我需要发送一个值作为“ double ”,但是我是:

  1. 一个值作为long
  2. 将其转换BigDecimal
  3. 在BigDecimal上调用方法scaleByPowerOfTen(使用“-2”使分成为整数值)。
  4. BigDecimal上调用doubleValue()以获取所需的double值。

现在我知道,当您对双精度值应用算术运算时,双精度值会失去精度,但是,如果我尝试基于 BigDecimal 按原样发送双精度值,例如(我相信)上述情况,我可能会得到什么。

这很重要,因为我必须以这种方式通过 SOAP 发送货币值 - 没有其他方式。

我还有这样的场景:使用String创建BigDecimal,然后在其上调用doubleValue() 。在这种情况下我能得到什么?

编辑:示例代码:

long amountInCents = 1852;
BigDecimal amountInWholeUnits = BigDecimal.valueOf(amountInCents).scaleByPowerOfTen(-2);
double amountToSend = amountInWholeUnits.doubleValue();
Run Code Online (Sandbox Code Playgroud)

至于金额以字符串形式提供的情况:

double amountToSend = new BigDecimal("18.52").doubleValue();
Run Code Online (Sandbox Code Playgroud)

更新

现在我有了示例代码,我只是想我可以测试和查看,所以我做了一个for循环并使用了System.out.println:到目前为止一切都很好,值是正确的,所以我相信发送时会是相同的通过 SOAP。如果我错了,请纠正我。

Sam*_*tep 1

由于一美分等于一美元的 1/100,并且由于数字 1/100 或0.01 不能精确地表示为二进制浮点数,因此会发生一些轻微的精度损失。在您的 18.52 美元的特定示例中,结果double将保持最接近double18.52 的值,但它不会完全等于 18.52。

  • 如果您要发送 XML,则只需将 BigDecimal 直接转换为 String 并发送即可。 (2认同)
  • @united-expression 如果服务尝试将货币值处理为“double”,而不是“BigDecimal”甚至“String”,那么该服务或生成的存根本质上存在设计缺陷。使用“double”作为中介很可能不会出现问题,并且错误只有在多次操作中累积时才会被注意到。 (2认同)