0

可能的重复:在 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

亲切的问候。

4

6 回答 6

9

因为 1 和 2 是整数。结果是 0。如果你把它转换成双精度数,它仍然是 0。这个问题是在几天前被问到的。

于 2010-09-03T11:52:52.787 回答
2

如果你将两个整数相除,那么结果也将是整数。所以 1/2 给你一个零,它是一个整数。然后你将 0 转换为 double,它仍然是零。

于 2010-09-03T11:56:11.923 回答
2

到目前为止,每个人都给了你正确的答案,我添加这个是为了让其他读者不要在评论中错过它。

使用与常规数学相同的规则。 首先是内括号。 因此,在第一个示例中,在除法发生之前将 1 强制转换为双精度数,从而使结果为双精度数(int 和双精度数的除法结果为双精度数)。如果它是(Double)1/2或,这听起来是正确的1/(Double)2。因此,在最后一个示例中,(Double)(1/2)首先(1/2)执行 int,在 int 上执行 int,结果为 int。然后 (Double) 将其转换为 Double。希望这不仅可以帮助您,还可以帮助其他对这个问题感到好奇的人。我自己有很多次我有一个很长的方程,并且不得不将方程的每个参数都转换为双精度。

于 2010-09-03T12:07:54.880 回答
1

尝试 (double)(1.0/2.0) - 这将给出您期望的答案。

于 2010-09-03T11:54:38.867 回答
1

如前所述,问题在于类型。您可以使用后缀来确保类型正确:

1d/2d=0.5
于 2010-09-03T11:57:09.893 回答
1
  1. (Double)1/2 = 0.5
  2. (Double)1/(Double)2 = 0.5
  3. (Double)((Double)1/(Double)2) = 0.5
  4. (Double)(1/2) = 0.0

在前三种情况下,您将整数值(当您不使用后缀或不包含点时,这是数字的默认类型)转换为 Double,然后在第一种情况下使用整数值进行除法,对于 2 和 3 使用双精度,与最后 (4) 种情况相反,括号首先更改运算顺序您将两个整数相除,然后将结果转换为 Double。

于 2010-09-03T12:08:56.230 回答