一尘不染

如何解决Java舍入双精度问题

java

似乎减法正在引发某种问题,并且结果值是错误的。

double tempCommission = targetPremium.doubleValue()*rate.doubleValue()/100d;

78.75 = 787.5 * 10.0 / 100d

double netToCompany = targetPremium.doubleValue() - tempCommission;

708.75 = 787.5-78.75

double dCommission = request.getPremium().doubleValue() - netToCompany;

877.8499999999999 = 1586.6-708.75

最终的期望值为877.85。

应该怎么做才能确保计算正确?


阅读 448

收藏
2020-03-01

共1个答案

一尘不染

要控制浮点算术的精度,应使用java.math.BigDecimal。阅读John Zukowski的《需要BigDecimal》以获取更多信息。

给定您的示例,最后一行将使用BigDecimal如下。

import java.math.BigDecimal;

BigDecimal premium = BigDecimal.valueOf("1586.6");
BigDecimal netToCompany = BigDecimal.valueOf("708.75");
BigDecimal commission = premium.subtract(netToCompany);
System.out.println(commission + " = " + premium + " - " + netToCompany);

结果为以下输出。

877.85 = 1586.6 - 708.75
2020-03-01