为什么这会导致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。这里有人知道为什么吗?
此
(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,得到浮点答案。
1
和2
是整数值,而不是浮点值。
将整数值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;