23

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

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

非常感谢。

4

9 回答 9

60

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

decimal c = ((decimal)a / b) * 100;
于 2010-04-08T17:23:14.327 回答
14

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

decimal c = (0) * 100

最好做,

decimal c = ((decimal)a/(decimal)b) * 100
于 2010-04-08T17:21:30.020 回答
9

100 / 200 是 1/2 或 0.5。由于您使用的是整数,因此它向下舍入为 0(零)。并且 0 * 100 仍然是 0。括号内的部分总是首先被评估:如果你想让它工作,使用:

decimal c = (a * 100) / b;

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

于 2010-04-08T17:23:10.173 回答
2

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

decimal c = (a / (decimal)b) * 100; 
于 2010-04-08T17:23:47.083 回答
1

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

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

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

我建议这样做:

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

这将强制执行的数学运算为您寻求的十进制值。

于 2010-04-08T17:28:53.793 回答
1

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

C# 有一个它将执行的隐式数字转换列表。

概括此列表:整数类型可以转换为浮点类型,但反之则不行。整数类型也可以隐式转换为decimal,但浮点类型不能。

注意:这也意味着将其中一个整数转换为另一种类型将导致整个答案都是该类型。前任:(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)
于 2010-04-08T18:19:15.003 回答
0

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

于 2010-04-08T17:23:20.873 回答
0

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

于 2010-04-08T17:24:04.353 回答
0

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

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

于 2010-04-08T18:14:33.210 回答