失败/成功占总项目的百分比



假设我有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。

如果你改变你的totaldouble,你可以修复这个问题,因为你开始做浮点除法而不是整数除法。

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来强制将它们转换为十进制。

最新更新