为什么这会导致0而上下相反

本文关键字:上下 为什么 | 更新日期: 2023-09-27 18:25:15

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

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

此公式适用于4个对象。Theta在所有声明为float的对象中,值为15708。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放在括号里时,结果是0.0,而不是取决于1/2的位置。但当我把(1/2)放在末尾时,结果是0.0。这里有人知道为什么吗?

为什么这会导致0而上下相反

(1 / 2)

计算结果为0,因为它是整数除法。如果你说

(1 / 2f)

(1 / (float) 2)

你会没事的,因为它会强制浮动分割。或者,更好的是,只写0.5

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

或者你可以只写0.5,IMHO比1/2更可读。

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

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

为什么不写这个:

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

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

1/2是整数除法,其结果是整数0。

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

去掉括号会改变运算的顺序,现在您将整个(浮点)公式除以2,得到浮点答案。

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

将整数值1除以整数值2,得到的结果是整数值CCD-9,而不是浮点值0.5

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

所以你最终要做的是:

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