为什么我无法使用 Int 获取百分比

23
请原谅我的编程知识。我知道这是一个简单的问题,但我不明白为什么结果始终为0。为什么用小数会好些呢?
int a = 100;
int b = 200;
decimal c = (a / b) * 100;
感谢您的提问。

3
不行。a * 100 / b 仍然会截断小数,然后转换为十进制类型。你最终将得到没有尾数的结果。 - Armstrongest
1
c = (a * 100M) / b; 另外,请参阅http://mathworld.wolfram.com/IntegerDivision.html。 - Greg
9个回答

60

整数除法总是截断余数。 这是在进行除法运算时完成的,而不是在将数字分配给变量时(我猜想您可能已经假设过这一点)。

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

截断也被称为数学中的Floor操作。 - rlb.usa
4
“是否是适当的地板”取决于它如何处理负数。我想,它会将-1.2更改为-1,而不是-2。 - Steven Sudit
@rlb.usa:IEEE规范指出向下取整舍入到负无穷大。正数的小数部分被截断,但任何负数的小数都会导致其向下舍入(即-1.1变成-2)。以这种方式进行强制转换将截断小数部分,因此-1.1将变为-1。 - Adam Robinson

14

由于a和b是整数,因此a/b的值始终为0。因此,当计算括号中的值时,实际上是在进行以下操作:

decimal c = (0) * 100

最好这样做:

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

“int/int=int”是一个编程中的表达式,你似乎知道它,但没有解释清楚。 - ANeves
2
除非为 ab 指定不同的值,否则 a/b 始终返回 0。如果有不同的值,则其结果将为 a / b - Jeffrey L Whitledge

9

100 / 200等于1/2或0.5。由于您正在使用整数,它会向下舍入为0(零)。而且0 * 100仍然是0。括号内的部分总是首先计算:如果您想让它工作,请使用:

decimal c = (a * 100) / b;

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


就像我对Stu Mackellar说的那样,这个方法并不完全可行,因为它会截断数据。 - Steven Sudit
2
如果你将其重写为 (a * 100M) / b,你将得到你想要的结果。 - Anthony Pegram
@Steven,正如我在他的回答中对你所说的那样,这可能是Daoming想要的。鉴于他从ints开始并想要一个百分比,这就是我理解他的请求的方式。@Anthony同样,我想要一个整数答案。 - tloflin
1
@tlofin,正如其他人所说,如果他想要一个整数答案,他会将其存储为整数 - Anthony Pegram
@Anthony,谁知道呢,你可能是对的。我认为最好给出两个答案,这样他可以选择他想要的。 - tloflin

2

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

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

1
在强类型语言中,数学运算的结果通常与较大的类型相同。
C#有一个隐式数字转换列表。
概括这个列表:整数类型可以转换为浮点类型,但反之则不行。整数类型也可以隐式转换为decimal,但浮点类型则不能。
注意:这也意味着将其中一个int强制转换为另一种类型将导致整个答案成为该类型。 例如:(decimal) a / b * 100.0 = 50.0 简而言之:
在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)

即使 100 / 200 * 100.0 得出了一个小数结果,它仍然是0 - 请注意。 - ANeves
第四个例子解决了这个问题。具体来说,用数字代替:100 / 200 * 100.0 = (100 / 200 = 0) * 100.0 = 0.0 - Powerlord

1

所做的数学运算仍然是整数运算。

(a/b) (100/200 或 1/2) 是在两个整数上进行的,因此结果为零。 零 * 100 还是零。

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

我建议这样做:

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

这将强制执行所需的十进制值。


使用100.0M代替100,以避免隐式转换的成本。 - Eric Mickelsen
但是请确保在第一个操作中使用100.0M。(有关澄清,请参见其他答案。) - ANeves

0

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


我认为这不会像你想象的那样起作用。它会向下取整。例如,如果a=1,b=3,我们希望c为33.333(尽可能多的保留3)。使用您的代码,我们将得到33.0。 - Steven Sudit
正确。楼主没有提到他想要一个实数,但我猜测小数点应该可以暗示。 - Stu Mackellar
4
如果你把它改写成(a * 100M) / b,就能得到你想要的结果。 - Anthony Pegram
@Steven,我们不知道Daoming想要哪个。考虑到他正在使用整数,他可能希望百分比四舍五入。@Stu,你那里有一个多余的结束括号(编辑:已修复)。 - tloflin
2
@tloflin 在这种情况下应该是 'int c'。此外,答案中一定要提到。 - Eric Mickelsen

0

整数类型 int 只能表示整数,所以 100/200 的结果是 0。0*100 仍然是 0。将类型改为小数型,就可以解决这个问题。


0
在使用整数时,'/'代表DIV(除法商),'%'代表MOD(取余)。DIV是除法的商,MOD是除法的余数。因此,100/200 = 0,100%200 = 100。
所以,在您的情况下,您需要将变量a和b的类型更改为十进制(decimal)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接