哪种数值类型转换更适合简单的数学运算?

时间:2016-05-09 07:46:39

标签: c# type-conversion precision numeric

我想知道哪种转换对于简单的数学运算更好(关于性能/速度和精度/最少损失)以及它们的不同之处?

示例:

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);

其实我的问题是关于转换而不是类型本身。

3 个答案:

答案 0 :(得分:5)

修改

回答你完全改变的问题:

第一行double double1 = integer1 / (5 * integer2);执行整数除法,所以不要这样做。

在将结果转换为double之前,行var double8 = Convert.ToDouble(integer1 / (5 * integer2));也在进行整数除法,所以也不要这样做。

除此之外,您列出的所有不同方法最终都会为示例代码中的每一行调用一次IL指令Conv.R8

唯一真正的区别是Convert.ToDouble()会进行方法调用,所以你应该避免这种情况。

double1double8以外的每一行的结果都是相同的。

所以你应该选择最简单的:var double2 = integer1 / (5.0 * integer2);

在更复杂的情况下,请花时间查看代码是否存在差异。

答案 1 :(得分:2)

您的代码行之间的差异与转换无关,其中一些是完全不同的,价值也不相同。

1.    float float1 = integer1 / (5 * integer2);

5 * interger2提供intint除以int给出int,并将int值分配给{{1}变量,使用隐式转换,因为float的范围小于intfloat,结果会得到float float1 = 1 / (5 * 2) 0。

System.Single

2. var float2 = integer1 / (5.0 * integer2); 基本上是5.0,因此5.0d的类型为float2System.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表示)。