我有两个整数,我想划分得到一个百分比.
这就是我现在所拥有的:
int mappedItems = someList.Count(x => x.Value != null);
int totalItems = someList.Count();
(int)(((double)mappedItems /(double) totalItems) * 100)
Run Code Online (Sandbox Code Playgroud)
这给出了正确的答案.但这需要做很多事情来做一些简单的事情,比如两个数字之间的百分比.
有一个更好的方法吗?什么东西不涉及铸造?
Joh*_*lla 47
如何mappedItems * 100.0 / totalItems
将其转换为适当的类型?
dra*_*oot 10
通过适当舍入获得百分比的唯一整数方法是:
int result = ( mappedItems * 200 + totalItems ) / ( totalItems * 2 );
Run Code Online (Sandbox Code Playgroud)
我们怎么去那里?如果我们以浮点方式做这件事,那就是Math.Floor( mappedItems * 100.0 / totalItems + 0.5 )
.我们需要通过乘以0.5除以totalItems,然后将0.5*totalItems移动到被除数,然后将被除数和除数乘以2以使分数消失,将此公式转换为整数:
mappedItems*100.0/totalItems + 0.5 => mappedItems*100.0/totalItems + totalItems*0.5/totalItems =>(mappedItems*100.0 + 0.5*totalItems)/ totalItems =>(mappedItems*200.0 + totalItems)/(totalItems*2).
此时公式仅为整数.当我们进行整数除法时,我们得到浮点结果,因此只有整数的结果等同于上面提到的浮点数.
如果你只是想避免演员表,你可以写:
(100 * mappedItems) / totalItems
Run Code Online (Sandbox Code Playgroud)
但那会快速溢出mappedItems > int.MaxValue / 100
.
这两种方法都将百分比降低了.要获得正确的舍入,我会将结果保持为double:
((double)mappedItems /(double) totalItems) * 100
Run Code Online (Sandbox Code Playgroud)
只使用整数运算就可以获得正确的舍入结果:
int percent = (200 * mappedItems + 1) / (totalItems * 2);
Run Code Online (Sandbox Code Playgroud)
通过乘以2,加1并除以2,你实际上增加了一半.这使整数除法进行舍入而不是截断.