美文网首页Web 前端开发
JavaScript 字节单位换算函数【详解】

JavaScript 字节单位换算函数【详解】

作者: 唐小狼 | 来源:发表于2019-05-06 15:20 被阅读0次

前言:我们在日常开发中,经常会遇到字节单位换算的场景。一般用简单的除法来计算时,都会遇到计算精度的问题。有关 JavaScript 浮点数陷阱 的问题,看一参考一下这篇不错的文章。下面,我们着重要将的是一种精确字节单位换算的详解:

1. 先看代码

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);

这段代码是很好用,而且也是网上普遍流传的一种方法,我们下面就详细了解一下,为什么这段代码可以实现这种效果呢?

我们可以看到,这个函数中的核心运算是对数运算和指数运算,JavaScript 中的 Math.log() 函数是对数运算,需要强调的一点是,它是自然对数运算(以 e 为底)。

我们都知道,1024 = 2^10,那么进行对数运算就会变为:

10 = log_{2}1024

接下来就需要理解这行核心代码了:let exp = Math.floor(Math.log(bytes)/Math.log(2));。理解它之前,我们需要搬出来对数运算的一个重要推论——换底公式,如下:

log_{a}b = \frac{log_{c}b}{log_{c}a}

现在是不是很明了了,Math.log(bytes)/Math.log(2) 其实就是再求 bytes 以 2 为底的指数,我们换算一下,如下:

\frac{log_{e}{bytes}}{log_{e}{2}} = log_{2}{bytes}

exp = log_{2}{bytes}

最后的 exp 就是我们得到的指数了。exp 为 10 时,bytes 就是 1024。所以后面的运算都是依据 10 这个单位量来计算的。i 为 1 就是最起码有一个 KB 的量级了,i 为 2 就是最起码有一个 MB 的量级,等等类推,后续做了一些保留小数位的优化等等,就不再赘述了,欢迎大家共同交流类似有趣的代码~~

相关文章

  • JavaScript 字节单位换算函数【详解】

    前言:我们在日常开发中,经常会遇到字节单位换算的场景。一般用简单的除法来计算时,都会遇到计算精度的问题。有关 Ja...

  • JavaScript 字节单位换算函数

    业务场景: 内存使用量的展示,数据是以Mb为单位的,接口里是类似"1234567890"这样的数据,不便于用户理解...

  • Js字节单位换算函数

    字节转换为单位大小 单位大小转换为字节

  • 编码

    编码单位单位换算bit(位)最小单位Byte(字节)一字节等于8bit,英语表示是1 Byte=8 bitsKB1...

  • 浙江选考信息技术必考点 | 存储容量

    考点梳理 1、 单位换算 2、 存储容量计算公式 考频统计 真题详解

  • 逆向开发--汇编基础

    1. 单位换算 字节:byte,1个字节由8bit组成,可以存储在8位寄存器中2个16进制位表示1字节 字:wor...

  • 单位换算

    一、分类 1、长度单位、面积单位、体积(容积)单位 巧记:记长度单位,平方零翻倍,立方零3倍 特殊:1公顷=100...

  • 单位换算

    张长占 济南市民生大街小学 谈话导入:这几年学了哪些单位换算? 生:时间,长度,体积,容积… 想想单位换算你们都是...

  • 单位换算

    换算公式 面 积 换 算 1平方公里(km2)=100公顷(ha)=247.1英亩(acre)=0.386平方英里...

  • 单位换算

    一公斤=2斤,一斤=500克,一两=50克,一斤=10两 一公里=2里,1里=500米

网友评论

    本文标题:JavaScript 字节单位换算函数【详解】

    本文链接:https://www.haomeiwen.com/subject/dooroqtx.html