2010-04-16 54 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); 
}