为什么这会导致0和颠倒?

时间:2012-02-21 18:24:04

标签: c# math

目前我正在撰写我的论文,并且遇到了我以前从未见过的.Net C#的行为。我在谈论计算中的错误。 我实现了这个公式:

1/2 *(Theta i-1 + Theta i)+ Sum(Alph k,k = 1,i-1)

此公式适用于4个对象。 Theta在声明为float的所有对象中,值为1,5708。 Alpha初始化为0,每次迭代都会增加。

第一项建议

    float alpha = 0;
    float value = 0;
    for (int sphereCount = 1; sphereCount < this.spheres.Count; sphereCount++)
    {
        value = (1/2) * (this.spheres[sphereCount - 1].Theta + this.spheres[sphereCount].Theta);
        alpha += value;
    }

此版本值始终为0.0! 所以我把它改成了:

工作实施

    float alpha = 0;
    float value = 0;
    for (int sphereCount = 1; sphereCount < this.spheres.Count; sphereCount++)
    {
        value =(this.spheres[sphereCount - 1].Theta + this.spheres[sphereCount].Theta) * 1/2;
        alpha += value;
    }

通过移除1/2周围的括号并将其置于计算结束时,它可以工作。

为什么这样?

当你将1/2放在括号中而不依赖于1/2的位置时,结果似乎是0.0。但是当我在最后放置(1/2)时它会产生0.0。 这里有人知道为什么吗?

6 个答案:

答案 0 :(得分:8)

(1 / 2)

评估为0,因为它是整数除法。如果你说

(1 / 2f)

(1 / (float) 2)
你会没事的,因为它会强制浮动。或者,更好的是,只需写下0.5

答案 1 :(得分:3)

如果写1/2,则使用整数除法计算结果,得到整数结果。您可以通过将其中一个数字更改为浮点数来强制浮点除法,如1/2f中所示。

或者你可以写0.5,其中恕我直言的可读性高于1/2。

答案 2 :(得分:1)

为什么乘以1?而不是这个:

value =(this.spheres[sphereCount - 1].Theta + this.spheres[sphereCount].Theta) * 1/2; 

为什么不写这个:

value =(this.spheres[sphereCount - 1].Theta + this.spheres[sphereCount].Theta) / 2; 

答案 3 :(得分:0)

你应该写1.0 / 2或0.5而不是1/2。

1/2是整数除法,得到整数0。

答案 4 :(得分:0)

因为1/2被视为整数运算,因此被舍入为0.

删除括号会改变操作的顺序,现在您将整个(浮点)公式除以2并得出浮点答案。

答案 5 :(得分:0)

那是因为12是整数值,而不是浮点值。

将整数值1除以整数值2时,结果为整数值0,而不是浮点值0.5

当您删除括号并更改乘法的顺序时,表达式的其他部分将首先乘以1,这将隐式地将整数值1转换为浮点值。然后将结果除以2,它也将隐式转换为浮点值。

所以你最终要做的是:

value = ( (this.spheres[sphereCount - 1].Theta + this.spheres[sphereCount].Theta) * (float)1 ) / (float)2;