我们假设我有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%
我的代码出了什么问题?
答案 0 :(得分:1)
因为您的代码与integer division一起运行,但您的计算器可以执行浮点除法。
您的(5 * 100) / 8
会返回62
,而不是62.5
,因为两个操作数都是int
,此操作将始终忽略小数部分。
当你除以两个整数时,结果总是一个整数。对于 例如,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
以强制将其转换为小数。