简单的计算由于某种原因不起作用
好吧,我正在尝试计算两个值的百分比。 这应该是非常简单的,但由于一些奇怪的原因,它不起作用。 我太累了/笨到想不出来。 这是我的代码,它一直返回0,我在调试时检查了值,并且FilesCompleted为295,TotalFilesCount为25002,returnvalue var只为0,它应该是1。
private int CalculatePercentComplete(int FilesCompleted, int TotalFilesCount) { int returnvalue = (FilesCompleted / TotalFilesCount) * 100; if (returnvalue > 100 || returnvalue < 1) return 1; else return returnvalue; }
我在调试时检查了值,并且FilesCompleted为295,TotalFilesCount为25002,returnvalue var只为0,它应该是1。
不,因为所有算术都是用整数完成的。 首先评估这个表达式:
(FilesCompleted / TotalFilesCount)
那是295 / 25002. 整数运算的结果是0 …然后当你将它乘以100时,你仍然得到0.最简单的解决办法就是先进行乘法运算:
int returnvalue = (FilesCompleted * 100) / TotalFilesCount;
请注意,如果FilesCompleted
大于int.MaxValue / 100
,则会溢出。 您可以通过在浮点运算中执行所有操作来解决此问题:
int returnvalue = (int)((FilesCompleted * 100.0) / TotalFilesCount);
…或使用long
整数运算:
int returnvalue = (int)((FilesCompleted * 100L) / TotalFilesCount);
当然,如果你不希望拥有疯狂数量的文件,这些都不是必需的。 (你可以获得4200万个文件…)
另请注意,您的参数名称违反了.NET命名约定。 它们应该是camelCased – totalFilesCount
和filesCompleted
。
怎么样
int returnvalue = (int)(((double)FilesCompleted / TotalFilesCount) * 100);
这是做什么的
-
将
int
FilesCompleted转换为double
。 例如,如果它是295,那么这将它转换为295.0,以便除法发生在双倍。没有必要将
TotalFilesCount
转换为double也可以将double乘以整数(或整数乘以double)返回double。 -
所以返回的double结果是0.011799056075513958,它乘以100
-
因此返回的结果是1.1799056075513958,最终转换为int,返回1
FilesCompleted/TotalFilesCount
返回0.01,其中int格式为0,尝试FilesCompleted*100/TotalFilesCount
!
确实,简单的错误,当使用int进行转移时,答案将是一个int。 你的答案将介于0和1之间,因此向下舍入为0(int)。
使用:
int returnvalue = (int)((FilesCompleted / (double)TotalFilesCount) * 100);
要使计算使用double作为小数,然后将其乘以100并将其转换为int。