总项目失败/成功百分比

时间:2015-07-26 16:13:42

标签: c#

我们假设我有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();

格式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%

我的代码出了什么问题?

3 个答案:

答案 0 :(得分:1)

因为您的代码与integer division一起运行,但您的计算器可以执行浮点除法。

您的(5 * 100) / 8会返回62,而不是62.5,因为两个操作数都是int,此操作将始终忽略小数部分。

来自/ Operator (C# Reference)

  

当你除以两个整数时,结果总是一个整数。对于   例如,7/3的结果是2。

如果您将total更改为double,则可以解决此问题,因为您开始执行浮点除法而不是整数除法。

double total = 8.0;

退房;

答案 1 :(得分:0)

那是因为整数的除法运算符/只返回整数部分。

如果需要强制转换为float,double或decimal。

var result = ((float)(5 * 100)) / 8;

如果您要划分的任何值是float,double或decimal,则除法运算符将支持小数部分。

答案 2 :(得分:0)

这是C#的一个非常基本的错误。您已将计算定义错误。

(success * 100) / total

这意味着在success * 100之后,结果将被解析为整数。它现在是300整数。 300/8 = 37整数。

相反,您可以将100替换为100m以强制将其转换为小数。