为什么这会返回 0?
Why is this returning 0?
也许我熬夜太多了,但我有以下代码:
MessageBox.Show(
Convert.ToInt32(
Math.Round(
(double)( ( i+1 )/r.Count )*100 ,
0
)
).ToString()
);
总是 returns 0,即使 i=120000
和 r.Count=150000
也是如此。这是一个简单的进度计算,其中 i
是循环中的当前迭代,r
是集合( List() )。
我已经把代码分开了,连下面的还是returns0:
Convert.ToInt32(
Math.Round(
(double)(( 120000+1 )/167428 )*100
, 0 )
)
不确定这里发生了什么,所以对我做错了什么有任何见解(可能是前额拍击)。应该是(使用上面的数字),返回 71.
@Habib 的标记为重复:
that duplicate you claim -- is actually different, even the
solutions don't apply here as this was a casting issue to double, and
not adding 'm' with additional decimal points to each variable in
play.
(( 120000+1 )/167428 ) 将计算为 0
167428 不进入 120001。您可以尝试这样:
Convert.ToInt32(
Math.Round(
(((double)120000f+(double)1f )/(double)167428f )*(double)100f
, 0 )
)
在 进行整数除法后,您正在加倍 。
因为 ( 120000+1 )/167428
仍在使用整数数学来完成。它不是 ~0.716,而是 0.
如果您以后想避免这种情况,请确保您也将分子和分母转换为双精度数。
( (double)( i+1 )/(double)r.Count )*100
以下将评估为 ( 120000+1 )/167428 ) 到 0,因为它们是 int 并且不保持小数精度,试试这个
Convert.ToInt32(Math.Round(((double)(120000+1 ) / (double)167428 ) * 100))
这与隐式转换有关
https://msdn.microsoft.com/en-us/library/ms173105.aspx
操作:(120000+1)/167428
returns 一个整数作为结果,0。
您在执行此整数除法后正在转换 double。
像其他用户建议尝试转换值:
(double)(( (float)120000f+1 )/(float)167428f )*100
如果 r.Count
> i+1
,那么 (i+1) / r.Count
会给你一个零。两者都是整数,因此小数点后的任何内容都会被截断。
您的意思可能是将 i+1
或 r.Count
转换为两倍,然后您会得到您期望的答案。
例如:
(i+1) / (double)r.Count
试试这个:
您必须在除法之前将两个值之一转换为 double。
Convert.ToInt32(
Math.Round(
(((double)( 120000+1 ))/167428 )*100
, 0 )
)
也许我熬夜太多了,但我有以下代码:
MessageBox.Show(
Convert.ToInt32(
Math.Round(
(double)( ( i+1 )/r.Count )*100 ,
0
)
).ToString()
);
总是 returns 0,即使 i=120000
和 r.Count=150000
也是如此。这是一个简单的进度计算,其中 i
是循环中的当前迭代,r
是集合( List() )。
我已经把代码分开了,连下面的还是returns0:
Convert.ToInt32(
Math.Round(
(double)(( 120000+1 )/167428 )*100
, 0 )
)
不确定这里发生了什么,所以对我做错了什么有任何见解(可能是前额拍击)。应该是(使用上面的数字),返回 71.
@Habib 的标记为重复:
that duplicate you claim -- is actually different, even the solutions don't apply here as this was a casting issue to double, and not adding 'm' with additional decimal points to each variable in play.
(( 120000+1 )/167428 ) 将计算为 0
167428 不进入 120001。您可以尝试这样:
Convert.ToInt32(
Math.Round(
(((double)120000f+(double)1f )/(double)167428f )*(double)100f
, 0 )
)
在 进行整数除法后,您正在加倍 。
因为 ( 120000+1 )/167428
仍在使用整数数学来完成。它不是 ~0.716,而是 0.
如果您以后想避免这种情况,请确保您也将分子和分母转换为双精度数。
( (double)( i+1 )/(double)r.Count )*100
以下将评估为 ( 120000+1 )/167428 ) 到 0,因为它们是 int 并且不保持小数精度,试试这个
Convert.ToInt32(Math.Round(((double)(120000+1 ) / (double)167428 ) * 100))
这与隐式转换有关
https://msdn.microsoft.com/en-us/library/ms173105.aspx
操作:(120000+1)/167428
returns 一个整数作为结果,0。
您在执行此整数除法后正在转换 double。
像其他用户建议尝试转换值:
(double)(( (float)120000f+1 )/(float)167428f )*100
如果 r.Count
> i+1
,那么 (i+1) / r.Count
会给你一个零。两者都是整数,因此小数点后的任何内容都会被截断。
您的意思可能是将 i+1
或 r.Count
转换为两倍,然后您会得到您期望的答案。
例如:
(i+1) / (double)r.Count
试试这个:
您必须在除法之前将两个值之一转换为 double。
Convert.ToInt32(
Math.Round(
(((double)( 120000+1 ))/167428 )*100
, 0 )
)