2015-03-13 148 views
0
public double hypotenuse() 
{  
    //return Math.hypot(leg, leg); //returns 7.0710678118654755 
    //return 0.1 * Math.floor(Math.hypot(leg, leg) * 10); //returns 7.0 
    //return 0.1 * Math.ceil(Math.hypot(leg, leg) * 10); //returns 7.1000000000000005 
    return 0.1 * Math.round(Math.hypot(leg, leg) * 10); //returns 7.1000000000000005 
} 

我想四捨五入到最近的第十位,所以這個數字應該舍入到7.1。爲什麼此方法適用於Math.floor,但不適用於Math.round?有沒有人有任何見解?如何四捨五入到最接近的第十位

謝謝,

天空

+2

什麼是這種語言? – 2015-03-13 19:43:26

+0

不同的語言,但可能的點:http://stackoverflow.com/q/6875007/239394。在我看來,你只是遇到雙精度舍入問題。 – Andrew 2015-03-13 20:44:41

+0

@EugeneSh。 Java的。 – 2015-03-13 22:07:16

回答

0

在問候你的答案給你自己,你不希望將類型A的對象B型,對它進行操作,然後將其轉換回類型A.如果你不能夠做​​任何事情其他。

以下是你想要它做的事情:

public double hypotenuse() 
{ 
    return Math.round(Math.hypot(leg, leg) * 10)/10.0; 
} 

我不完全知道爲什麼。這將需要一些深入到彙編層面的內容。

真正的問題是每個Java中的double都只有有限的位數來存儲它的小數部分。在現實生活中有無數可能的實數。你無法用64位來表示每一個實數。這就是爲什麼你應該避免銀行應用程序和軟件中的浮點計算,它們要求數字是準確的。在計算中將幾個雙打乘以一起可以引入相當大的誤差。 See this explanation on another SO answer, which does a great job of explaining this further.

如果您確實需要它,請使用BigDecimal

+0

我知道有一種方法可以用一行代碼來完成它!我發誓我嘗試了這一點,但它沒有奏效,但現在它正在工作。謝謝! :-)我已經在幾個程序中遇到了這個四捨五入的問題,它給我帶來了很大的壓力!非常感謝你的幫助! – Skylin 2015-03-15 03:27:46

+0

不客氣。如果你關心完美的精度,那麼你應該真的使用'BigDecimal'。 – 2015-03-15 03:28:59

+0

@Skylin,請問爲什麼你非常關心這些數字是準確的? – 2015-03-15 03:33:05

-1

如果這是JS:

的Math.round()函數返回四捨五入爲最接近的整數的數的值。

+0

但它是否在最近的** 10 **地方? – zero298 2015-03-13 20:13:09

+0

對於Java,對不起。 Math.floor也是如此,並且工作正常。沒關係,但我發現了一些不同的方法。 – Skylin 2015-03-13 20:59:54

0

沒關係,這是我發現的作品。

public double hypotenuse() 
{  
    double hypot = Math.hypot(leg, leg); 
    String str = String.format("%1.1f", hypot); 
    hypot = Double.valueOf(str); 
    return hypot; 

}