java - 如果未对金额应用任何操作,BigDecimal.doubleValue() 的准确性如何

标签 java soap double precision bigdecimal

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

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

现在我知道 double 值在对它们应用算术运算时会失去精度,但是如果我尝试按原样发​​送 double 值,我可能得到什么基于 BigDecimal,例如(我相信)上面的场景是。

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

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

编辑: 示例代码:

long amountInCents = 1852;
BigDecimal amountInWholeUnits = BigDecimal.valueOf(amountInCents).scaleByPowerOfTen(-2);
double amountToSend = amountInWholeUnits.doubleValue();

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

double amountToSend = new BigDecimal("18.52").doubleValue();

更新

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

最佳答案

因为一美分等于一美元的 1/100,而且数字 1/100 或 0.01 不能 完全表示为二进制 float ,会发生一些轻微的精度损失。在 $18.52 的特定示例中,生成的 double 将保持最接近 18.52 的 double 值,但它不会完全等于 18.52。

关于java - 如果未对金额应用任何操作,BigDecimal.doubleValue() 的准确性如何,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31297716/

相关文章:

java - 为什么JPanel尺寸不对?

java - android 使用 Intent 与 class.forName

java - Selenium Java 中的按钮无法一致点击

java - IWAB0014E 发生意外异常。尝试使用 apache cxf2.7 创建 Web 服务时

python - 如何使用 Python SOAPpy 访问 Yahoo Enterprise Web Services?

python - 如何从 Python 中字符串的前 8 个字节计算 double float ?

java - 将浮点值分配给 double 值

java - jackson : Updating (not creating new object) JavaObject from Json?

将字符串转换为 double

java - Apache Camel RouteBuilder 配置方法