Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数学四舍五入((4.006&èx2B;4.007)/2),3)=4.006?_C#_Math_Double_Average_Rounding - Fatal编程技术网

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
,我已经编辑了您的标题。请参阅“”,其中的共识是“不,他们不应该”。