为什么我不能通过使用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。
因此,在您的情况下,您需要将a
和b
类型更改为decimal
。