字节单位换算用Math.log转换下的好处是什么呢?

const byteConvert = function(bytes) {
    if (isNaN(bytes)) {
        return '';
    }
    let symbols = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
    let exp = Math.floor(Math.log(bytes)/Math.log(2));
    if (exp < 1) {
        exp = 0;
    }
    let i = Math.floor(exp / 10);
    bytes = bytes / Math.pow(2, 10 * i);

    if (bytes.toString().length > bytes.toFixed(2).toString().length) {
        bytes = bytes.toFixed(2);
    }
    return bytes + ' ' + symbols[i];
};

// 函数调用
byteConvert(bytes);

看到网上字节单位换算的写法,疑惑为啥不直接使用let i = Math.floor(bytes / 1024),使用Math.floor(Math.log(bytes)/Math.log(2))转换的好处是什么呢?

阅读 2.2k
1 个回答

高中数学还给老师了吧,

loga c/loga b=logb c

主要是为了算到底用哪个单位,不用select case了

let i = Math.floor(bytes / 1024)

只是把字节转成kb,如果大于1024kb,还要再除1024,变成MB

const byteConvert = function(bytes) {
    if (isNaN(bytes)) {
        return '';
    }
    let symbols = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
    //计算bytes是2的多少次方
    let exp = Math.floor(Math.log(bytes)/Math.log(2));
    if (exp < 1) {
        exp = 0;
    }

    //算出应该在symbols中用哪个单位。用i来确定
    //比如,bytes是1024,哪么exp=10,i就等于1,symbols[1]就等是'KB'
    let i = Math.floor(exp / 10);
    bytes = bytes / Math.pow(2, 10 * i);

    if (bytes.toString().length > bytes.toFixed(2).toString().length) {
        bytes = bytes.toFixed(2);
    }
    return bytes + ' ' + symbols[i];
};
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题