猿问

如何解决Java舍入双重问题

如何解决Java舍入双重问题

似乎减法触发了某种问题,其结果是错误的。

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

78.75=787.5*10.0/100 d

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。

如何确保计算正确?


慕妹3242003
浏览 847回答 3
3回答

千万里不及你

要控制浮点算法的精度,应使用java.math.BigDecimal..朗读,阅读对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

凤凰求蛊

正如前面的答案所述,这是做浮点运算的结果。正如前面的海报所建议的,当您正在进行数值计算时,请使用java.math.BigDecimal.然而,使用BigDecimal..将双值转换为BigDecimal,您可以选择使用新的BigDecimal(double)构造函数或BigDecimal.valueOf(double)静态工厂法使用静态工厂方法。双构造函数转换double转到BigDecimal静态工厂有效地将其转换为String,然后将其转换为BigDecimal.当您遇到这些微妙的舍入错误时,这一点就变得相关了。一个数字可能显示为.585,但在内部它的值是‘0.58499999999999996447286321199499070644378662109375’.如果你用BigDecimal构造函数,您将得到不等于0.585的数字,而静态方法将给出一个等于0.585的值。double value = 0.585; System.out.println(new BigDecimal(value)); System.out.println(BigDecimal.valueOf(value));在我的系统上0.58499999999999996447286321199499070644378662109375 0.585

绝地无双

另一个例子:double&nbsp;d&nbsp;=&nbsp;0;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;<=&nbsp;10;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;+=&nbsp;0.1;}System.out.println(d);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;prints&nbsp;0.9999999999999999&nbsp;not&nbsp;1.0使用BigDecimal代替。编辑:另外,要指出的是,这不是一个‘Java’四舍五入的问题。其他语言表现出类似的(虽然不一定是一致的)行为。Java至少保证了这方面的一致行为。
随时随地看视频慕课网APP
我要回答