https://blog.csdn.net/qq_29774269/article/details/103997520
现在计算机中的浮点表示及运算普遍采用 IEEE 754 标准,该标准默认的舍入方式是向偶数舍入 (round-to-even),也称为向最接近的值舍入 (round-to-nearest)。
向偶数舍入有两个原则,一是向最接近的值舍入,再一个是当处在 ” 中间值 ” 时看有效数值是否是偶数,如果是偶数则直接舍去不进位,如果是奇数则进位。
先拿几个十进制的举例,再看二进制的。比如以下几个十进制都要求舍入到个位:1.4 和 1.6,所谓的 ” 中间值 ” 就是,比如 1.4,因为是舍入到个位,所以它处在 1 和 2 之间,那中间值就是 (1+2)/2=1.5。那么 1.4 就不是中间值,根据向最接近的值舍入的原则 1.4 跟 1 更近,所以舍入得到 1。同理,1.6 舍入得到 2。再看 1.5 和 2.5:根据上述可知,1.5 和 2.5 都是中间值,那么就要看有效数字是否是偶数,1.5 的有效数字是 1,是奇数,所以要进位得到 2;而 2.5 的有效数字是 2,所以直接舍去不进位得到 2。
上面说的方法根据 ” 中间值 ” 来进行舍入是从概念中抽取的方法,还有个方法我觉得更简便。为了说明这个方法,以及不混淆概念,我引入一个 ” 半值 ” 叫法(我自己心里这么叫而已,业界应该没有这说法,大家根据自己情况觉得怎么好记就怎么叫吧)。” 半值 ” 是这么算的:看有效数字后面的数值有多少位,假设有 n 位,则半值为 ” (基数^n)/2”。比如 1.4,有效数字后面是 4,1 位数字,十进制的基数是 10,那么半值为 (10^1)/2=5。拿有效数字后面的数值跟半值比较,大则进,小则舍,半值就看有效数字奇偶,奇则进,偶则舍。比如,1.4 的 4 比半值 5 小,所以直接舍去得 1,而若是 1.6 的 6 比半值 5 大则要进 1 得 2。1.5 的 5 是半值,看有效数字 1 是奇数,则进位得 2;2.5 的 5 是半值,看有效数字 2 是偶数,则直接舍去得 2。再比如,如果是 1.48,同样舍入到个位,48 是 2 位数字,那么半值为 (10^2)/2=50,48 比 50 小,直接舍去得 1。或者还可以更简单的,比如 1.48,先只看有效数字的后一位 4,一个十进制位权值是 10,10/2=5,然后 1.48 的 48 有两位,拿“5”也补足两位得“50”,所以半值就是 50。
二进制也是同样的道理,二进制的基数是 2,半值就这么算 (2^n)/2,然后二进制的奇偶判断看最有效位,0 则偶,1 则奇。
二进制 10.010,舍入到小数点下一位,那么看有效数字后面的数字是 10,半值 (2^2)/2=2=二进制的 10,正好是半值,那么看有效数字是 10.0,是偶数,所以直接舍去得 10.0。再看 10.011,半值同样是 10,而有效数字后面的 11 比 10 大则直接进位得 10.1。再看 10.110,半值同样是 10,有效数字后面的 10 正好是半值,看有效数字 10.1 是奇数,那么要进 1 位,得 11.0。