为了账号安全,请及时绑定邮箱和手机立即绑定

为什么Math.圆形(2.5)返回2而不是3?

为什么Math.圆形(2.5)返回2而不是3?

尚方宝剑之说 2019-06-25 16:53:18
为什么Math.圆形(2.5)返回2而不是3?在C#中,Math.Round(2.5)是2。应该是3,不是吗?为什么它是2而不是C#?
查看完整描述

3 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

首先,这并不是一个C#bug-它将是一个.NET bug。C#是语言-它不能决定Math.Round已实现。

第二,如果你读到医生,您将看到默认的四舍五入是“四舍五入”(银行家的四舍五入):

返回值
类型:System.Double
如果a的分数分量介于两个整数之间,其中一个是偶数,另一个是奇数,则返回偶数。注意,此方法返回Double而不是整型。

评语
这种方法的行为遵循IEEE标准754,第4节。这种四舍五入有时被称为四舍五入到最近,或银行家的四舍五入。它最大限度地减少了由在单个方向上一致舍入中点值而产生的舍入误差。

您可以指定Math.Round应该围绕中点使用过载这需要一个MidpointRounding价值。有一个超载MidpointRounding对应于没有重载的每个重载:

这种默认选择是否正确是另一回事。(MidpointRounding仅在.NET 2.0中引入。在此之前,我不确定是否有任何简单的方式来实现想要的行为而不自己去做。)特别是,历史表明这不是预期行为-在大多数情况下,这是API设计中的一大罪过。我看得出来为什么银行家的四舍五入很有用.。但对很多人来说还是个惊喜。

您可能有兴趣查看最近的Java等效枚举(RoundingMode提供了更多的选择。(它不只是处理中点问题。)


查看完整回答
反对 回复 2019-06-25
?
UYOU

TA贡献1878条经验 获得超4个赞

这被称为舍入到偶数(或银行家的四舍五入),这是一种有效的舍入策略,以尽量减少应计金额错误。(MidpointRounding.ToEven)..理论上说,如果你总是在同一个方向上舍入一个0.5个数字,那么误差就会增加得更快(圆圈到甚至应该把它降到最小)。(A).

请按照以下链接获得以下MSDN描述:

  • Math.Floor

    向负无穷远的方向发展。
  • Math.Ceiling

    正无穷大。
  • Math.Truncate

    向上或向下都是零。
  • Math.Round

    ,其舍入到最接近的整数或指定的小数位数。如果行为在两种可能性之间完全相等,例如舍入,则可以指定行为,以便最后的数字是偶数(“

    Round(2.5,MidpointRounding.ToEven)

    “变得更远,离零更远”

    Round(2.5,MidpointRounding.AwayFromZero)

    “成为3)。

下图和表格可能会有所帮助:

-3        -2        -1         0         1         2         3
 +--|------+---------+----|----+--|------+----|----+-------|-+
    a                     b       c           d            e

                       a=-2.7  b=-0.5  c=0.3  d=1.5  e=2.8
                       ======  ======  =====  =====  =====Floor                    -3      -1      0      1      2Ceiling                  -2       0      1      2      3Truncate                 -2       0      0      1      2Round(ToEven)            -3       0      0      2      3Round(AwayFromZero)      -3      -1      0      2      3

请注意Round比它看起来强大得多,仅仅是因为它可以四舍五入到一个特定的小数位数。所有其他四舍五入的小数都是小数。例如:

n = 3.145;a = System.Math.Round (n, 2, MidpointRounding.ToEven);       // 3.14b = System.Math.Round (n, 2, MidpointRounding.AwayFromZero); // 3.15

对于其他函数,您必须使用乘法/除法来达到同样的效果:

c = System.Math.Truncate (n * 100) / 100;                    // 3.14d = System.Math.Ceiling (n * 100) / 100;                     // 3.15

(A)当然,这一理论依赖于这样一个事实:您的数据在偶数一半(0.5、2.5、4.5、.)之间有相当均匀的分布。和奇数一半(1.5,3.5,.)

如果“一半值”是均数(例如),错误的累积速度就像你总是四舍五入一样快。


查看完整回答
反对 回复 2019-06-25
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

从…Msdn,Math.圆形(Double A)返回:

如果a的分数分量介于两个整数之间,其中一个是偶数,另一个是奇数,则返回偶数。

..所以2.5,介于2和3之间,被舍入到偶数(2)。这叫做银行四舍五入(或四舍五入),是一种常用的四舍五入标准。

同一条MSDN文章:

这种方法的行为遵循IEEE标准754,第4节。这种四舍五入有时被称为四舍五入到最近,或银行家的四舍五入。它最大限度地减少了由在单个方向上一致舍入中点值而产生的舍入误差。

您可以通过调用Math.哪个回合的重载来指定不同的舍入行为。MidpointRounding模式。


查看完整回答
反对 回复 2019-06-25
  • 3 回答
  • 0 关注
  • 783 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信