2010-08-28 45 views
3

我有一個方法,計算兩個xyz線之間的距離,並返回一個很好的長雙數,如10,12345678963235。 但我只需要10,12345,那對我來說就夠了。我怎樣才能做到這一點? 這是返回給我的值的方法:只獲得一個X長度數字的前10個數字

public static double Distance(Vector3 v1, Vector3 v2) 
{   
    return 
    (
     Math.Sqrt 
     (
      (v1.X - v2.X) * (v1.X - v2.X) + 
      (v1.Y - v2.Y) * (v1.Y - v2.Y) + 
      (v1.Z - v2.Z) * (v1.Z - v2.Z) 
     ) 
    ); 
} 

謝謝!

回答

4

這是一個非常錯誤的方法。你從來沒有想要在你的程序中故意拋開精度。您的電腦耐心等待,無需追蹤多達15位有效數字。這與你將會獲得雙重價值一樣多。如果你故意讓它不那麼準確,並且在進一步的計算中繼續使用結果值,你會遇到很大的麻煩。

只有人關心數字的樣子。通過將值顯示給人眼,並且然後擺脫噪聲數字。像:

Console.WriteLine("{0:N5}", value); 

string output = value.ToString("N5"); 
+1

我不同意。當一個數字應該被管理到一定程度的準確性,你應該四捨五入(或截斷)。作爲示例,我的行業中使用的一個軟件在貨幣的小數點後保留6位有效數字,但僅顯示正常的2.這會導致錯誤和發票總數看起來不匹配訂單項總和。 – 2010-08-28 20:25:52

+0

@Mike:我不同意。浮點值模擬物理數字。大自然不計算10個手指,只有人類能做到。沒有普遍的常數可以四捨五入到一個不錯的數字,並且仍然是準確的。一隻滿載的燕子不會在10點飛行。每小時12345英里,對於一英里或一小時來說是毫無頭緒的。然而,有一類計算表達*希望10的權力。會計師對此很挑剔。但是這些計算應該總是使用System.Decimal,永遠不會使用double或float。 – 2010-08-28 21:08:08

+0

也許,我在迴應中提到了強調的「從不」。還有,是歐洲還是非洲的燕子? – 2010-08-29 16:29:52

3

重新閱讀問題後,我認爲你唯一的選擇是轉換爲字符串,取前10個字符,然後再轉換爲雙精度。

如果你的號碼是小數(你有,而不是.,所以我不確定)下面的方法應該工作,否則你需要做字符串的事情。


Math.Round(
    Math.Sqrt 
    ( 
     (v1.X - v2.X) * (v1.X - v2.X) + 
     (v1.Y - v2.Y) * (v1.Y - v2.Y) + 
     (v1.Z - v2.Z) * (v1.Z - v2.Z) 
    ), 5); 

http://msdn.microsoft.com/en-us/library/aa340228.aspx

+0

我怎樣才能將二者結合起來?我也需要Math.Sqrt。 現在我使用它: this.distance_label.Text =「玩家和目標之間的距離:」+ Math.Round(Vector3.Distance(PlayerPos,TargetPos),7).ToString(); 我覺得它有點髒:D – 2010-08-28 17:08:06

+0

你可以在Distance方法裏面調用'Round'。 – Nate 2010-08-28 17:12:36

0

有用於精密確切的N個十進制數字沒有浮點編碼。如果你想要的話,使用小數。

如果你只想要7位數的精度存儲然後返回一個浮點數,這只是方便。

public static float Distance(Vector3 v1, Vector3 v2) 
{   
    return 
    (
     (float)Math.Sqrt 
     (
      (v1.X - v2.X) * (v1.X - v2.X) + 
      (v1.Y - v2.Y) * (v1.Y - v2.Y) + 
      (v1.Z - v2.Z) * (v1.Z - v2.Z) 
     ) 
    ); 
} 

如果你想顯示的精度7位則: result.ToString( 「F7」);

+0

也謝謝你:)我學到了很多東西。 – 2010-08-28 18:01:03

相關問題