为什么我不能通过使用Int获得百分比

时间:2010-04-08 17:20:36

标签: c# integer-division

请原谅我的编程知识。我知道这是一件简单的事情,但我不明白为什么结果总是为0.为什么十进制会很好?

int a = 100;
int b = 200;
decimal c = (a / b) * 100;

非常感谢。

9 个答案:

答案 0 :(得分:57)

整数除法总是截断余数。这是在数字被分割时完成的,当它被分配给变量时(正如我猜你假设的那样)。

decimal c = ((decimal)a / b) * 100;

答案 1 :(得分:14)

值a / b将始终返回0,因为它们是整数。因此,当评估括号内的值时,您在技术上就是这样做

decimal c = (0) * 100

更好,

decimal c = ((decimal)a/(decimal)b) * 100

答案 2 :(得分:9)

100/200是1/2或0.5。由于您正在使用整数,它会向下舍入为0(零)。并且0 * 100仍为0.括号内的部分始终首先进行评估:如果要使其正常工作,请使用:

decimal c = (a * 100) / b;

编辑:如果你想要一个更精确的值而不是一个“整数百分比”(即33.333%而不是33%),你应该使用Bragaadeesh的答案。

答案 3 :(得分:2)

正在执行整数运算,结果然后存储为小数。整数数学中的100/200是0.要获得百分比,请在进行计算之前将至少一个值转换为十进制值。

decimal c = (a / (decimal)b) * 100; 

答案 4 :(得分:1)

正在完成的数学仍然是整数数学。

(a / b)(100/200或1/2)在两个整数上完成,因此结果为零。零* 100是......好吧,仍为零。

您遇到的问题是操作顺序(a和b是整数,因此执行整数运算)。

我建议:

decimal c=((decimal)a)/((decimal)b)*100;

这会强制执行所选的十进制值。

答案 5 :(得分:1)

在强类型语言中,数学运算的结果通常与较大类型的结果相同。

C#有一个implicit numeric conversions列表。

概括此列表:可以将积分类型转换为浮点类型,但反之亦然。积分类型也可以隐式转换为decimal,但浮点类型不能。

注意:这也意味着将其中一个int转换为另一个类型将导致整个答案成为该类型。 例如:(decimal) a / b * 100.0 = 50.0

TL; DR:

在C#中:

int / int = int
int + decimal = decimal
decimal + int = decimal
int / int * decimal = (int / int = int) * decimal = decimal
int - float = float
int * double = double
float / decimal = an error
int - uint = an error (either that or ulong)

答案 6 :(得分:0)

将其设为decimal c = (a * 100) / b;

答案 7 :(得分:0)

int只能是整数,所以100/200将为0. 0 * 100仍为0.将类型更改为小数,它将起作用

答案 8 :(得分:0)

使用整数时,这个'/'代表DIV,这个'%'代表MOD。 DIV是除法的商,MOD是其余的。因此,100/200 = 0和100%200 = 100。

因此,在您的情况下,您需要将ab类型更改为decimal