似乎减法正在引发某种问题,并且结果值是错误的。
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。
应该怎么做才能确保计算正确?
要控制浮点算术的精度,应使用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
问题内容: 我该如何克服Java android中双精度乘法的精度问题?请注意,我正在将字符串值转换为double值。 例如:当我将两个double值相乘时: 我得到以下结果:0.8999999999999999 我得到的一些结果是。 0.6 * 3 = 1.7999999999999998; 0.2 * 0.2 = 0.04000000000000001; 等等 除了上述结果外,我想得到以下结果
问题内容: 我的同事做了这个实验: 对于这个一年级的操作,我希望得到以下输出: 但是意外的输出是: 为什么在如此简单的操作中double会失败?而且如果double不是这项工作的数据类型,我应该使用什么? 问题答案: 在内部以分数形式存储在 二进制文件中 -例如 值-或值-不能以精确的分数形式存储在二进制中,因此不能存储精确的值,并且相减后的值也不太精确。 如果您关心精确的十进制算术,请使用。 您
本文向大家介绍js如何解决数字精度丢失的问题?相关面试题,主要包含被问及js如何解决数字精度丢失的问题?时的应答技巧和注意事项,需要的朋友参考一下 const verifyFunc = (left, right) => { return Math.abs(left - right) < Number.EPSILON * Math.pow(2, 2); }; console.log(verifyFu
问题内容: java中双值的乘法运算符的保证精度是多少? 例如,2.2 * 100是220.00000000000003,但是220是双精度数。220.00000000000003是220之后的下一个两倍。 问题答案: 乘法工作正常,但不能精确表示为双精度。最接近的双打是: 2.199999999999999733(0x4001999999999999) 2.200000000000000177(
问题内容: 我试图确定双精度的最大精度是多少。在此链接的可接受答案的注释中,Java中的double保持精度 @PeterLawrey将max precision设置为15。 您如何确定呢? 问题答案: @PeterLawrey表示最大精度为15。 实际上,这根本不是他所说的。他说的是: 双精度有15个小数位 他错了。它们的精度为15个十进制 数字 。 任何数字中的小数位数由其对数10的对数给出。
我试图确定double的最大精度是多少。在这个链接中接受的答案的注释中,Java中的Retain precision with double@PeterLawrey声明max precision In 15。 你如何确定这一点?