C# 数学四舍五入((4.006&èx2B;4.007)/2),3)=4.006?
C# 数学四舍五入((4.006&èx2B;4.007)/2),3)=4.006?,c#,math,double,average,rounding,C#,Math,Double,Average,Rounding,类似的问题,但没有双精度和小数点后3位。 不同之处在于,两个整数的平均值可能是一个双精度的结果,但当我们使用(int)Math.Ceiling((double)value)时,结果是一个整数。 但在这种情况下,我们有两个双人和 Math.Round(((4.006+4.007)/2),3); // returns 4.006 Math.Round(((4.008+4.007)/2),3); // returns 4.008 为什么?来自MSDN: 返回值 类型:系统。将最接近a的整数加
类似的问题,但没有双精度和小数点后3位。
不同之处在于,两个整数的平均值可能是一个双精度的结果,但当我们使用(int)Math.Ceiling((double)value)时,结果是一个整数。 但在这种情况下,我们有两个双人和
Math.Round(((4.006+4.007)/2),3); // returns 4.006
Math.Round(((4.008+4.007)/2),3); // returns 4.008
为什么?来自MSDN:
返回值
类型:系统。将最接近a的整数加倍。如果分数分量
的值是两个整数的中间值,其中一个是偶数,另一个是
如果为奇数,则返回偶数。请注意,此方法
返回Double而不是integral类型
备注
该方法的行为遵循IEEE标准754第4节。这
这种四舍五入有时被称为四舍五入到最近的,或银行家的
四舍五入。它最大限度地减少了由于一致性导致的舍入误差
沿单个方向舍入中点值
同时检查这个相关的你所链接的问题的答案大致概括了这一点<代码>数学。舍入舍入到最接近的偶数,而不是最接近的数字。舍入到最后一个偶数是常见的做法。您是否使用
Math.Round()
重载探索了其他舍入选项?是的,我需要平均两个双精度((x.xxx+y.yyy)/2),两个都有3位小数。当一个双精度是偶数(x.xx(偶数))而另一个是奇数(y.yy(奇数))时,我们将得到一个小数点后4位的双精度,第四位是5(w.www5)。所以我需要将这个双精度舍入到小数点后3位。1)使用decimal
,而不是double
。double不能准确地表示那样的数字,导致意外的舍入行为。这包括在代码中添加一个<代码> m < /COD>后缀到文字2),当该值正好在中间时,<代码>圆默认情况下,舍入到最近的偶数值。如果您想在0.5
上进行四舍五入,请输入middpointrounding.AwayFromZero
,我已经编辑了您的标题。请参阅“”,其中的共识是“不,他们不应该”。