失败/成功占总项目的百分比
本文关键字:项目 百分比 成功 失败 | 更新日期: 2023-09-27 18:04:39
假设我有8项。
在这8人中,5人成功,3人失败。
如果我想获得成功和失败的百分比,精度为2位小数,我将这样做:
int total = 8;
int success = 5;
int failure = 3;
string success =((decimal)((success * 100) / total)).FormatDecimal();
string failure = ((decimal)((failure * 100) / total)).FormatDecimal();
Format decimal是一个扩展,它将十进制转换为具有x个小数的字符串。
public static string FormatDecimal(this decimal value, int decimals = 2)
{
return value.ToString(string.Format("0.{0}", new string('0', decimals)));
}
现在如果我用计算器这样做,结果是正确的:
success: (5 * 100) / 8 = 62.5 %
failure: (3 * 100) / 8 = 37.5 %
然而,我的解决方案回报我62.00 %和37.00%
我的代码有什么问题?
因为你的代码运行的是整数除法但是你的计算器可以做浮点除法
您的(5 * 100) / 8
返回62
,而不是62.5
,因为两个操作数都是int
,并且此操作将始终忽略小数部分。
From /
Operator (c# Reference)
当两个整数相除时,结果总是一个整数。为例如,7/3的结果为2。
如果你改变你的total
为double
,你可以修复这个问题,因为你开始做浮点除法而不是整数除法。
double total = 8.0;
查看;
- 7.7.2分区操作符
这是因为整数的除法运算符/
只返回整数部分。
如果需要强制转换为float、double或decimal。
var result = ((float)(5 * 100)) / 8;
如果要除法的值是浮点数、双精度数或小数,则除法运算符将支持小数部分。
这是c#最基本的错误。你把计算定义错了。
(success * 100) / total
表示在success * 100
之后,结果将被解析为整数。现在是300的整数形式。300/8 = 37,
相反,您可以用100m
替换100
来强制将它们转换为十进制。