每Microsoft documentation,MidpointRounding.ToZero
不进行"中点舍入".微软似乎在这里搞砸了界面:
MidpointRounding
最初被创建为一个枚举,用于在四舍五入为偶数(ToEven
)和四舍五入为最接近零(AwayFromZero
)之间进行 Select .
- 后来在
Math.Round
的基础上增加了其他舍入方法:向负无穷大舍入(ToNegativeInfinity
)、向正无穷大舍入(ToPositiveInfinity
)和向零舍入(ToZero
).请注意,这些不是朝着这些方向中的一个方向旋转到最近的;它们是朝着这些方向中的一个方向旋转的.例如,ToZero
、3.1、3.2、3.5、3.6和3.8都四舍五入为3.
- Microsoft没有使用新名称(如
RoundingMethod
)创建新的枚举,而是将这些新值作为成员添加到MidpointRounding
中.
结果是,所有五种舍入方法的名称都以MidpointRounding.Name
的形式命名,即使其中只有两种方法是与中点相关的舍入到最近的方法.
(我们也看到使用To
而不是Toward
的术语不敏感.3.4四舍五入为3,接近于零.它不会四舍五入为零.IEEE 754对这些舍入方法使用"Forward".)
再加上this documentation告诉我们Math.Round
的运算方式是乘以10n并舍入到一个整数,而不是正确地确定对原始数字进行舍入,我们可以看到发生了什么:
- 72.6转换为
double
,生成最接近的表示值72.59999999999999431565811391919851303double
5859375.再乘以double
,得到7259.9999999999990905052982270717620849609375.在向零的方向上四舍五入为一个整数,得到7259.除以double
,如果使用的位数少于17位,则得到的72.590000000000003410605131648480892181396484375,打印为72.59.
- 82.6转换为
double
,生成82.59999999999999431565811391919851303double
5859375.再乘以double
,得出8260.这种情况与前一种情况的不同是由于实数相对于可表示数的位置的偶然性.然后8260除以double
,产生82.59999999999999431565811391919851303double
5859375,,如果使用的数字少于16位,则打印为82.6.