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

Which numeric type conversion is better for simple math operation?

我想知道对于简单的数学运算,哪种转换更好(关于 performance/speed 和 precision/most 更少的损失),它们有什么不同?

示例:

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

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

而不是 float/decimal 使用双:

通用问题的更通用的答案"Decimal vs Double":货币计算使用小数以保持精度,双精度用于不受微小差异影响的科学计算。由于 Double 是 CPU 的原生类型(内部表示存储在基数 2 中),因此使用 Double 进行的计算比 Decimal(在内部以基数 10 表示)进行的计算更好。

编辑

回应你完全改变的问题:

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

另外,var double8 = Convert.ToDouble(integer1 / (5 * integer2)); 行在将结果转换为双精度数之前进行整数除法,因此也不要这样做。

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

唯一真正的区别是 Convert.ToDouble() 会为此调用方法,因此您应该避免这种情况。

除了 double1double8 之外的每一行的结果都是相同的。

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

在更复杂的情况下,对代码计时以查看是否存在任何差异。

你的代码行之间的差异不是关于转换,有些是完全不同的东西,值也不一样。

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

5 * interger2 给出 intintint 给出 int,然后将 int 值分配给 float 变量,使用隐式转换,因为 int 的范围比 float 小。 float float1 = 1 / (5 * 2),你会得到一个 System.Single 0 作为结果。

2.    var float2 = integer1 / (5.0 * integer2);

5.0 本质上是 5.0d,所以 float2 的类型是 System.Doublevar float2 = 1 / (5.0 * 2) 你会得到一个 System.Double 0.1 作为结果。

3.   var float3 = integer1 / (5F * integer2);

使用上面相同的值你会得到 System.Single 0.1,这可能是你想要的。

4.   var float4 = (float)integer1 / (5 * integer2);

您将得到与第 3 项相同的结果。不同之处在于第 3 项是 int divides by float,而第 4 项是 float divides by int

5.   var float5 = integer1 / (float) (5 * integer2);
6.   var float6 = integer1 / ((float) 5 * integer2);
7.   var float7 = integer1 / (5 * (float) integer2);

这三者与第3项几乎相同,它计算出一个int divides by float,只是构建分隔线的方式不同。

8.   var float8 = Convert.ToDecimal(integer1 / (5 * integer2));
9.   var float9 = integer1 / Convert.ToDecimal(5 * integer2);

两者会给你System.Decimal个值,精度更高。 Item8 和 item1 有同样的问题,你会得到 0 因为 Convert.ToDecimal 的参数是 int 0.