2010-04-16 107 views
1

我有一个情况,我需要找出一个int进入小数多少次,但在某些情况下,我失去了精度。下面是方法:Java - 如何避免在拆分和转换为int时精度的损失?

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

这样做的问题是,如果我传递1.2作为小数量和5作为除数,我得到的5而不是6.如何restrusture这让我知道有多少次5进入十进制数作为int?

+2

我认为你需要给这个问题一个更广义的版本 - 如果你这样做提高了定义只使用有意义的整数,即5组分为1.2 = 0 /条款我怀疑你会得到答案,因为我怀疑这个问题是由于四舍五入的结果 – Mark 2010-04-16 18:26:29

+1

这与舍入和一切与公式无关。小数除以int是简单的(int)(decimalAmount/divisor)。我想这就是大卫正在寻找的东西。正如它代表的那样,代码实际上是在执行decimalAmount和divisor的乘法运算。 – 2010-04-16 18:32:55

回答

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

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

3

计算结果可能类似于5.999999999994,因为浮点结果不一定是整数。当你投到一个int,你截断,结果是5.对于另一个类似的参数集,你可能会看到一个结果6.0000000000002,它会给你6.

但事实上,这是如此敏感到浮点表示会引起质疑为什么你认为你想要这个 - 也许有更好的方法来做你想做的事情。例如,上面的答案是正确的,这简化了,然后它更不清楚重点是什么。

为了真正做到我认为您想要的事情,您不需要使用double s或float s。你需要java.util.BigDecimal - 查看它是如何工作的。您可以使用它来“精确地”乘以5和1.2得到6.

1

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

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