铸造金额为Double时发出

时间:2017-12-06 07:46:46

标签: java

我的程序收到的金额为string,然后使用Double将其转换为Double.parseDouble(transAmt)

现在,当传递的金额为"100.00"时,我们会遇到问题。

请告知是否会丢失精简数字的双精度数字

2 个答案:

答案 0 :(得分:1)

通过猜测"问题"可能是:Java中的double是数学实数的近似值。因此,100100.00之间没有区别,它只是相同的值。

答案 1 :(得分:0)

double不保持精度,是近似值,是(负)幂的总和2.因此,3.10可能在输出上为3.0999999785,这是一个在求和或乘法时放大的误差。

为了保持精确和准确 - 与财务软件一样 - 使用BigDecimal

BigDecimal amount = new BigDecimal("12.99"); // A precision of 2 digits.
BigDecimal base = new BigDecimal("4.33");
assert base.multiply(BigDecimal.valueOf(3)).compareTo(amount) == 0;

不幸的是,BigDecimal正常的数学运算符不可用,但一般情况下它并不像double那样不安全。