lodash阅读-ceil

730 阅读1分钟

ceil.js

// ceil.js,向上舍入
const ceil = createRound('ceil')
export default ceil

// creteRound.js
function createRound(methodName) {
  const func = Math[methodName] // 获取js的Math对象的方法
  return (number, precision) => { // 精度代表位数,正数代表保留小数点后几位,负数代表保留小数点前几位
    precision = precision == null ? 0 : (precision >= 0 ? Math.min(precision, 292) : Math.max(precision, -292)) // 获取精度值[-292, 292]之间
    if (precision) {
      // 1. 转成字符串形式,如123.45e
      // 2. 然后用e分割成数组['123.45', '']
      let pair = `${number}e`.split('e')
      // 1. 将上一步获取的数组和精度重新合并成字符串'123.45e1'(假如精度是1的话)、
      // 2. 然后调用实际的Math函数,即ceil('123.45e1') => ceil(1234.5) ==> 1234
      const value = func(`${pair[0]}e${+pair[1] + precision}`)

      // 将上一步获取的数值,再转成浮点数形式'1234e' => ['1234', '']
      pair = `${value}e`.split('e')
      // 恢复数据的精度 '1234e-1' => 123.4
      return +`${pair[0]}e${+pair[1] - precision}`
    }
    return func(number)
  }
}
// 数据转换流程如下
// (123.45, 1) => `123.45e` => ['123.45', ''] => ceil(`123.45e1`) => 1234 => `1234e-1` => 123.4

默认的Math.ceil只能对数据进行向上取整,lodash的ceil方法比Math.ceil强大一些