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

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

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

非常感谢。

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

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

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

 decimal c = (0) * 100 

更好,

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

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

 decimal c = (a * 100) / b; 

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

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

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

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

C#有一个隐含的数字转换列表。

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

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

TL;博士:

在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) 

正在进行的数学仍然是整数数学。

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

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

我建议这个:

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

这将强制执行数学到您寻找的十进制值。

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

使其成为decimal c = (a * 100) / b;

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

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