Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中到处浇铸(浮动)。只打双打更好吗?_C#_Casting_Floating Point_Double - Fatal编程技术网

在C#中到处浇铸(浮动)。只打双打更好吗?

在C#中到处浇铸(浮动)。只打双打更好吗?,c#,casting,floating-point,double,C#,Casting,Floating Point,Double,在XNA游戏中,我对大多数数值都使用浮点。大多数C#函数的输入/输出都是双倍的,所以我经常写(float)。我应该使用双打还是我的工作方式可以?你应该使用双打。它们比单精度浮点更精确,并且会有一个强制转换的开销。对于整数,最好从默认的int开始,对于浮点数,double和十进制精确数,decimal开始。然后对该选择进行更改,或者作为优化(float占用的空间小于double,因此如果您存储了大量的数据,这可能是一个合理的选择),以便更好地匹配一些外部强加的标准,或者因为它不足以满足要求(即,当

在XNA游戏中,我对大多数数值都使用浮点。大多数C#函数的输入/输出都是双倍的,所以我经常写(float)。我应该使用双打还是我的工作方式可以?

你应该使用双打。它们比单精度浮点更精确,并且会有一个强制转换的开销。

对于整数,最好从默认的
int
开始,对于浮点数,
double
和十进制精确数,
decimal
开始。然后对该选择进行更改,或者作为优化(
float
占用的空间小于
double
,因此如果您存储了大量的数据,这可能是一个合理的选择),以便更好地匹配一些外部强加的标准,或者因为它不足以满足要求(即,当您需要使用
long
而不是
int
)时。

如果性能是一个问题,您必须衡量较小的内存占用是否补偿了强制转换的成本,这将取决于您正在进行的强制转换的数量


如果性能不是一个问题,我会选择double以使代码更干净。

一般来说,这是一个好建议,但XNA本身倾向于使用
float
(例如,请参见
MathHelper
类)。不确定原因,可能是因为如果您正在复制和操纵大量数字(就像在3D游戏中一样)那么,使用32位的
浮点数
而不是64位的
双精度
之间的性能差异可能会很大。@LukeH-在这种情况下,我会选择导致最少强制转换的类型。如果要进行更多的XNA调用,那么就使用浮点数,否则就使用双精度。我认为Java和.NET需要显式的cast从
double
float
但不是相反,因为将数值量的最佳
double
表示转换为
float
将产生该量的最佳
float
表示,或者在该量的一个LSB之内。相反,将最佳
float
表示转换为将一个数量表示为
double
通常会产生与该数量的最佳
double
表示相去甚远的结果,并且可能会偏离数百个数量级(将铸造效果……3.0E+38*2.0与
float
(正确地比较大于float.MaxValue),与将3.0E+38f*2.0f转换为
double
(错误地比较大于1.0E+308)。或者,对于更常见的情况,比较
float f=(float)(1.0/10.0)的正确性;
双d=1.0f/10.0f;
。前一种类型的赋值需要强制转换,即使所有此类赋值在数字上基本正确。后一种类型不需要强制转换,即使大多数此类赋值都是完全错误的。