繁体   English   中英

Java-如何避免除法和强制转换为int期间的精度损失?

[英]Java - How to avoid loss of precision during divide and cast to int?

我遇到一种情况,我需要找出int转换为小数的次数,但是在某些情况下,我会失去精度。 方法如下:

public int test(double decimalAmount, int divisor) {
  return (int) (decimalAmount/ (1d / divisor));
}

问题是,如果我传入1.2作为十进制数,而传入5作为除数,则得到5而不是6。如何重新构造这个值,以便我知道5作为整数进入十进制数的次数?

public int test(double decimalAmount, int divisor) {
  return (int) (divisor * decimalAmount);
}

显然,这只是相乘然后被截断。 为什么您认为需要这种方法?

计算结果可能类似于5.999999999994,因为浮点结果不一定是整数。 当您转换为int时,您将截断,结果为5。对于另一组类似的参数,您可能会看到结果6.0000000000002,它将得到6。

但这对浮点表示非常敏感的事实使人们质疑为什么您认为自己想要这样做-也许有更好的方法来完成您想做的事情。 例如,上面的答案是正确的,将其简化,然后甚至更不清楚要点是什么。

要真正完成我认为您想做的事情,就不需要使用doublefloat 您需要java.util.BigDecimal查找其工作方式。 您可以使用它“精确”乘以5和1.2得到6。

浮点运算不正确,它们是近似值。 通过此操作,您可以得到例如5.9的结果。 将其强制转换为int结果为5(而不是6)。 尝试舍入而不是截断:

public int test(double decimalAmount, int divisor) {
  return Math.round(divisor * decimalAmount);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM