哪种数字类型转换更适合简单的数学运算?
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()
会为此调用方法,因此您应该避免这种情况。
除了 double1
和 double8
之外的每一行的结果都是相同的。
所以你应该选择最简单的:var double2 = integer1 / (5.0 * integer2);
在更复杂的情况下,对代码计时以查看是否存在任何差异。
你的代码行之间的差异不是关于转换,有些是完全不同的东西,值也不一样。
1. float float1 = integer1 / (5 * integer2);
5 * interger2
给出 int
,int
除 int
给出 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.Double
,var 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.
我想知道对于简单的数学运算,哪种转换更好(关于 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()
会为此调用方法,因此您应该避免这种情况。
除了 double1
和 double8
之外的每一行的结果都是相同的。
所以你应该选择最简单的:var double2 = integer1 / (5.0 * integer2);
在更复杂的情况下,对代码计时以查看是否存在任何差异。
你的代码行之间的差异不是关于转换,有些是完全不同的东西,值也不一样。
1. float float1 = integer1 / (5 * integer2);
5 * interger2
给出 int
,int
除 int
给出 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.Double
,var 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.