2014-06-05 72 views
1

我試圖返回一個取整爲小數點後兩位的double。我已經通過並驗證了,在每一步的過程中,我的所有值都是doubles。這裏是我的方法:Math.Round()實際上並沒有將我的雙精度舍入

public double FindAzimuthAtPointK(LwdData pointKData, SurveyData stationOne, SurveyData stationTwo) 
{ 
    var deltaDepth = stationTwo.MeasuredDepth - stationOne.MeasuredDepth; 

    var valueG = FindValueG(pointKData, stationOne, stationTwo); 
    var valueH = FindValueH(pointKData, stationOne, stationTwo); 
    var valueY = FindValueY(stationOne, stationTwo); 

    var sinStationOneInclination = Math.Sin(RadianToDegreeConversion * stationOne.Inclination); 
    var sinStationTwoInclination = Math.Sin(RadianToDegreeConversion * stationTwo.Inclination); 

    var sinStationOneInclinationSquared = Math.Pow(Math.Sin(RadianToDegreeConversion * stationOne.Inclination), 2); 
    var sinStationTwoInclinationSquared = Math.Pow(Math.Sin(RadianToDegreeConversion * stationTwo.Inclination), 2); 

    var partOneBottom = ((180 * deltaDepth) * Math.Tan(RadianToDegreeConversion * (valueG*valueY)/2))/(Math.PI * valueY); 

    var partOneTotal = Math.Pow((valueH/partOneBottom), 2); 

    var partTwo = sinStationOneInclinationSquared * sinStationTwoInclinationSquared; 

    var topTotal = RadianToDegreeConversion * (partOneTotal - partTwo); 

    var bottom = 2 * sinStationOneInclination * sinStationTwoInclination; 

    var acosValue = Math.Acos(topTotal/bottom); 

    var azimuthAtPointK = stationOne.Azimuth + acosValue; 

    return Math.Round(azimuthAtPointK, 2); 
} 

下面是實際的數學方程式(和subequations),手由客戶書面: enter image description here enter image description here

現在,什麼實際發生在這裏的是,返回值是315.57999999999998,當它應該是315.58。任何想法爲什麼會發生?

+1

嘗試使用'decimal'類型而不是'double'。這可能是一個精度問題,缺少雙倍數。 – evanmcdonnal

+0

實際上它是'必須'和'是',而不是'嘗試'和'可能':-)雙倍不是關於「雙精度」,而是雙倍精度覆蓋_some_精度的範圍。因爲它們是二進制的,所以只能表示2的冪__accurately__ – TaW

+0

可能的問題是,你不喜歡的數字接近315.58,可以用double來表示。這只是在使用浮點數時帶來的領域。 – hatchet

回答

5

這是關於雙精度和他們可以準確代表的數字。如果您需要絕對精確度,請使用小數點,或者在結束時將結果舍入爲顯示目的。

要回答最後四捨五入的問題,可能是因爲315.58的結果無法準確顯示爲2DP到2DP的結果。

+0

* ...或將您的結果放在大概是在顯示數值的時候,大概是這樣。 –

+0

這就是我正在做的。直到它纔會顯示最終結果,我不會將它四捨五入。 – MyCodeSucks

+1

另外請記住,該算法是基於「銀行家」的方法,所以你認爲可能取整取而代之。在Visual Basic(包括當前和.NET)從浮點數到整數的轉換使用銀行家舍入(round-to-even)。考慮到VB在財務/業務線應用中的使用,避免與其他舍入方法積累的偏差,這是有道理的。當您編寫Visual Basic CInt(1.0)時,編譯器會發出對Math.Round(1.0)的調用,然後將該調用的結果轉換爲Int32。 –

相關問題