四舍六入五成双-银行家舍入算法


四舍六入五成双-银行家算法

四舍六入五成双是一种比较精确比较科学的计数保留法,是由 IEEE 754 标准规定的浮点数取整算法, 是一种数字修约规则。

当舍去位的数值:

  • 小于等于 4 时:直接舍去该位
  • 大于等于 6 时:向前位进 1
  • 等于 5 时:
    • 5 后有数,向前位进 1
    • 5 后全部为 0 时:
      • 5 前的数值为奇数时:则向前位进 1 (将前位凑成偶数)
      • 5 前的数值为偶数时:则直接舍去该位

口诀:

四舍六入五考虑,
五后非零就进一,
五后皆零看奇偶,
五前为偶应舍去,
五前为奇要进一。

php 实现


function formatFloat($num, $precision)
{
    return round($num, $precision, PHP_ROUND_HALF_EVEN);
}

var_dump(formatFloat(9.8249, 2)); echo PHP_EOL;  // output:9.82  四舍
var_dump(formatFloat(9.82671, 2)); echo PHP_EOL;  // output:9.83  六入
var_dump(formatFloat(9.8351, 2)); echo PHP_EOL;  // output:9.84  五后非零就进一
var_dump(formatFloat(9.82501, 2)); echo PHP_EOL;  // output:9.83  五后非零就进一
var_dump(formatFloat(9.8250, 2)); echo PHP_EOL;  // output:9.82  五后为零看奇偶,五前为偶应舍去(这里就违背了四舍五入)
var_dump(formatFloat(9.8350, 2)); echo PHP_EOL;  // output:9.84  五后为零看奇偶,五前为奇要进一

js 实现


function fomatFloat(num, precision) {
    return Math.round(num * Math.pow(10, precision)) / Math.pow(10, precision);
}

文章作者: Alex
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Alex !
评论
  目录