请原谅我的编程知识。我知道这是一件简单的事情,但我不明白为什么结果总是为0.为什么十进制会很好?
int a = 100;
int b = 200;
decimal c = (a / b) * 100;
非常感谢。
答案 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。
因此,在您的情况下,您需要将a
和b
类型更改为decimal
。