2010-08-28 85 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

相关问题