可能的重复:在 c# 中
进行除法
1/252 = 0 的整数和双精度数?
你好,
也许是因为今天是星期五,但我无法理解:
(Double)1/2 = 0.5
(Double)1/(Double)2 = 0.5
(Double)((Double)1/(Double)2) = 0.5
(Double)(1/2) = 0.0
为什么最后一个操作是0?:S
亲切的问候。
因为 1 和 2 是整数。结果是 0。如果你把它转换成双精度数,它仍然是 0。这个问题是在几天前被问到的。
如果你将两个整数相除,那么结果也将是整数。所以 1/2 给你一个零,它是一个整数。然后你将 0 转换为 double,它仍然是零。
到目前为止,每个人都给了你正确的答案,我添加这个是为了让其他读者不要在评论中错过它。
使用与常规数学相同的规则。 首先是内括号。 因此,在第一个示例中,在除法发生之前将 1 强制转换为双精度数,从而使结果为双精度数(int 和双精度数的除法结果为双精度数)。如果它是(Double)1/2
或,这听起来是正确的1/(Double)2
。因此,在最后一个示例中,(Double)(1/2)
首先(1/2)
执行 int,在 int 上执行 int,结果为 int。然后 (Double) 将其转换为 Double。希望这不仅可以帮助您,还可以帮助其他对这个问题感到好奇的人。我自己有很多次我有一个很长的方程,并且不得不将方程的每个参数都转换为双精度。
尝试 (double)(1.0/2.0) - 这将给出您期望的答案。
如前所述,问题在于类型。您可以使用后缀来确保类型正确:
1d/2d=0.5
(Double)1/2 = 0.5
(Double)1/(Double)2 = 0.5
(Double)((Double)1/(Double)2) = 0.5
(Double)(1/2) = 0.0
在前三种情况下,您将整数值(当您不使用后缀或不包含点时,这是数字的默认类型)转换为 Double,然后在第一种情况下使用整数值进行除法,对于 2 和 3 使用双精度,与最后 (4) 种情况相反,括号首先更改运算顺序您将两个整数相除,然后将结果转换为 Double。