我想知道哪种转换对于简单的数学运算更好(关于性能/速度和精度/最少损失)以及它们的不同之处?
示例:
double double1 = integer1 / (5 * integer2);
var double2 = integer1 / (5.0 * integer2);
var double3 = integer1 / (5D * integer2);
var double4 = (double) integer1 / (5 * integer2);
var double5 = integer1 / (double) (5 * integer2);
var double6 = integer1 / ((double) 5 * integer2);
var double7 = integer1 / (5 * (double) integer2);
var double8 = Convert.ToDouble(integer1 / (5 * integer2));
var double9 = integer1 / Convert.ToDouble(5 * integer2);
其实我的问题是关于转换而不是类型本身。
答案 0 :(得分:5)
修改强>
回答你完全改变的问题:
第一行double double1 = integer1 / (5 * integer2);
执行整数除法,所以不要这样做。
在将结果转换为double之前,行var double8 = Convert.ToDouble(integer1 / (5 * integer2));
也在进行整数除法,所以也不要这样做。
除此之外,您列出的所有不同方法最终都会为示例代码中的每一行调用一次IL指令Conv.R8
。
唯一真正的区别是Convert.ToDouble()
会进行方法调用,所以你应该避免这种情况。
double1
和double8
以外的每一行的结果都是相同的。
所以你应该选择最简单的:var double2 = integer1 / (5.0 * integer2);
在更复杂的情况下,请花时间查看代码是否存在差异。
答案 1 :(得分:2)
您的代码行之间的差异与转换无关,其中一些是完全不同的,价值也不相同。
1. float float1 = integer1 / (5 * integer2);
5 * interger2
提供int
,int
除以int
给出int
,并将int
值分配给{{1}变量,使用隐式转换,因为float
的范围小于int
。 float
,结果会得到float float1 = 1 / (5 * 2)
0。
System.Single
2. var float2 = integer1 / (5.0 * integer2);
基本上是5.0
,因此5.0d
的类型为float2
,System.Double
您将获得var float2 = 1 / (5.0 * 2)
0.1作为结果
System.Double
使用上面相同的值,您将获得3. var float3 = integer1 / (5F * integer2);
0.1,这可能是您想要的。
System.Single
您将获得与第3项相同的内容。区别在于item3为4. var float4 = (float)integer1 / (5 * integer2);
,而item4为int divides by float
。
float divides by int
这三个与第3项几乎相同,它计算5. var float5 = integer1 / (float) (5 * integer2);
6. var float6 = integer1 / ((float) 5 * integer2);
7. var float7 = integer1 / (5 * (float) integer2);
,只是构建分隔符的不同方法。
int divides by float
这两个会给你8. var float8 = Convert.ToDecimal(integer1 / (5 * integer2));
9. var float9 = integer1 / Convert.ToDecimal(5 * integer2);
个值,它们具有更高的精度。 Item8与item1具有相同的问题,因为System.Decimal
的参数是Convert.ToDecimal
0,所以你会得到0。
答案 2 :(得分:1)
而不是float / decimal使用double:
通用问题“Decimal vs Double”的更通用的答案:用于保证精度的货币计算的小数,用于不受小差异影响的科学计算的Double。由于Double是CPU的原生类型(内部表示存储在基数2中),因此使用Double执行的计算优于Decimal(在内部以10表示)。