为啥我不能使用 Int 获得百分比
Posted
技术标签:
【中文标题】为啥我不能使用 Int 获得百分比【英文标题】:Why I cannot the get percentage by using Int为什么我不能使用 Int 获得百分比 【发布时间】:2010-04-08 17:20:35 【问题描述】:请原谅我的编程知识。我知道这是一件简单的事情,但我不明白为什么结果总是 0。为什么小数就可以了?
int a = 100;
int b = 200;
decimal c = (a / b) * 100;
非常感谢。
【问题讨论】:
那行不通。 a * 100 / b 仍然会截断小数,然后转换为十进制类型。你最终会没有尾数。 c = (a * 100M ) / b;另请参阅mathworld.wolfram.com/IntegerDivision.html 【参考方案1】:整数除法总是截断余数。这是在数字被除的时候完成的,不是当它被分配给变量时(我猜你假设)。
decimal c = ((decimal)a / b) * 100;
【讨论】:
截断也称为数学地板运算。 @rlb.usa:地板是否合适取决于它如何处理底片。不过,我相信它会将 -1.2 更改为 -1,而不是 -2。 @rlb.usa:IEEE 规范说,地板向负无穷大舍入。正数的小数部分会被截断,但负数的任何小数都会导致它向下舍入(即 -1.1 变为 -2)。以这种方式进行转换会截断小数部分,因此 -1.1 将变为 -1。【参考方案2】:值 a/b 将始终返回 0,因为它们是整数。因此,当评估括号内的值时,您在技术上是这样做的
decimal c = (0) * 100
最好这样做,
decimal c = ((decimal)a/(decimal)b) * 100
【讨论】:
-1 用于混淆和误导性的答案。int/int=int
,你似乎知道但没有解释。
“a/b 将始终返回 0”,除非为 a
和 b
提供不同的值,在这种情况下它将是 a / b
。【参考方案3】:
100 / 200 是 1/2 或 0.5。由于您使用的是整数,因此它向下舍入为 0(零)。并且 0 * 100 仍然是 0。括号内的部分总是首先被评估:如果你想让它工作,使用:
decimal c = (a * 100) / b;
编辑:如果您想要一个更精确的值而不是“整数百分比”(即 33.333% 而不是 33%),您应该使用 Bragaadeesh 的答案。
【讨论】:
正如我对 Stu Mackellar 所说的,这不太行,因为它会截断。 如果你把它改写为(a * 100M) / b
,你会得到你想要的结果。
@Steven,正如我在他的回答中对你说的,这可能是道明想要的。这就是我解释他的要求的方式,因为他从整数开始并想要一个百分比。 @Anthony 同样,我想要一个整数答案。
@tlofin,正如其他人所说,如果他想要整数答案,他会将其存储为整数。
@Anthony,谁知道呢,你可能是对的。我认为最好同时给出两个答案,这样他就可以选择他想要的。【参考方案4】:
正在执行整数数学运算,结果然后被存储为小数。整数数学中的 100 / 200 为 0。要获得百分比,请在进行计算之前将至少一个值转换为小数。
decimal c = (a / (decimal)b) * 100;
【讨论】:
【参考方案5】:在强类型语言中,数学运算的结果通常与较大类型的类型相同。
C# 有一个implicit numeric conversions 列表,它会做。
概括此列表:整数类型可以转换为浮点类型,但反之则不行。整数类型也可以隐式转换为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)
【讨论】:
100 / 200 * 100.0
仍然为 0,即使它产生十进制结果 - 请注意。
@sr pt:下面的第四个例子解决了这个问题。具体来说,用数字替换:100 / 200 * 100.0 = (100 / 200 = 0) * 100.0 = 0.0
【参考方案6】:
正在完成的数学仍然是整数数学。
(a/b) (100/200 或 1/2) 对两个整数进行运算,因此结果为零。零 * 100 是……嗯,还是零。
您遇到的问题是运算顺序(a 和 b 是整数,因此执行整数数学运算)。
我建议这样做:
decimal c=((decimal)a)/((decimal)b)*100;
这将强制执行的数学运算为您寻求的十进制值。
【讨论】:
使用 100.0M 而不是 100 来避免隐式转换的成本。 但是请确保在第一个操作上使用 100.0M。 (请参阅其他答案以获得澄清。)【参考方案7】:int只能是整数,所以100/200就是0。0*100还是0。把类型改成小数就行了
【讨论】:
【参考方案8】:设为decimal c = (a * 100) / b;
【讨论】:
我认为这不会像你想象的那样奏效。它会向下取整。例如,如果 a=1 且 b=3,我们希望 c 为 33.333(最多可以容纳尽可能多的尾随 3)。使用您的代码,我们将拥有 33.0 是的。 OP没有提到他想要一个实数,但我猜它是由小数暗示的。 如果你把它改写为(a * 100M) / b
,你会得到你想要的结果。
@Steven,我们不知道道明想要哪个。鉴于他使用的是整数,他可能希望将百分比四舍五入。 @Stu,你有一个额外的结束括号(编辑:固定)。
@tloflin 在这种情况下它应该是'int c'。另外,答案中一定要提到。【参考方案9】:
使用整数时,“/”代表 DIV,“%”代表 MOD。 DIV 是除法的商,MOD 是余数。所以,100/200 = 0 和 100%200 = 100。
因此,根据您的情况,您需要将 a
和 b
类型更改为 decimal
。
【讨论】:
以上是关于为啥我不能使用 Int 获得百分比的主要内容,如果未能解决你的问题,请参考以下文章