我需要发送一个值作为“double”,但我是:
- 将一个值作为long
- 将其转换为BigDecimal
- 在 BigDecimal 上调用方法 scaleByPowerOfTen(使用“-2”使美分成为整数值)。
- 在 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/