zoukankan      html  css  js  c++  java
  • JavaScript 中的四舍五入

    在 JavaScript 中,对数值进行四舍五入操作的场景有以下几种:

    • 向上取整:ceil
    • 向下取整:floor
    • 四舍五入:round
    • 固定精度:toFixed
    • 固定长度:toPrecision
    • 取整:parseInt、位运算

    本文将对这 6 个 API 进行简单的讲解和总结。

    1、向上取整: ceil

    ceil 是`天花板`的意思,表示在一个数值之上,且距离该数最近的整数。ceil 是 Math 对象的静态方法,需要传递一个参数,其调用方法如下:

    Math.ceil(12.34); //13
    Math.ceil(12.68); //13

    2、向下取整: floor

    floor 是`地板`的意思,表示在一个数值之下,且距离该数最近的整数。floor 是 Math 对象的静态方法,需要传递一个参数,其调用方法如下:

    Math.floor(12.34); // 12
    Math.floor(12.68); // 12

    3、四舍五入: round

    round 的作用是对一个浮点数进行四舍五入,并保留整数位。round 也是 Math 对象的静态方法,也需要传递一个参数,其调用方法如下:

    Math.round(12.34); // 12
    Math.round(12.54); // 13

    4、固定精度: toFixed

    toFixed 和上面三个方法不同,它是 Number 原型上实现的一个方法,其作用是对一个浮点数进行四舍五入并保留固定小数位 toFixed 需要传递一个参数,其调用方式如下:

    100.456001.toFixed(2); // 100.46
    100.456001.toFixed(3); // 100.456

    5、固定长度: toPrecision

    toPrecison 也是 Number 原型上实现的一个处理浮点数的方法,和 toFixed 不同的是,它是对一个浮点数进行四舍五入并保留固定长度的有效数字,包括整数部分。

    99.456001.toPrecision(5);  // 99.456
    100.456001.toPrecision(5); // 100.46

     6、取整: parseInt

    parseInt 是 全局对象 window上的一个方法,其作用是对一个可转换的数值取整,分为以下两种情况:

    1. 将字符串数值转化为 Number 整数,对字符串的每一个字符进行转化,直到遇到不可转化的字符(包括小数点)停止。

    2. 对浮点类型数值取整,忽略小数部分,不做四舍五入处理

    // 字符串数值
    parseInt('100') ; // 100
    parseInt('100axt'); // 100
    parseInt('100xh20'); // 100
    parseInt('100.78'); // 123
    // Number 类型
    parseInt(100.12) ; // 100
    parseInt(100.78); // 100

    7、取整: 位运算

    • | 0   : 和 0 进行 按位或 操作,原值不变
    • ~~   : 两次 按位非 操作得到的也是原值
    • >> 0 : 右移 0 位
    • << 0 : 左移 0 位
    • >>> 0: 无符号右移 0 位 

    这些位运算符在实现取整操作时,会表现出一些共同的特征:

    • 对于 Number 类型来说,直接应用位操作, 和 parseInt 得到的结果几乎一样;
    • 对于其他类型,内部会先通过 Number() 将其转换为一个数值,然后再应用位操作。
    • 对特殊 NaN 和 Infinity 值应用位操作时,这两个值都会被当成 0 来处理 。

    对于 Number 类型,直接应用位运算。

    ~~ 100.12;  //  100
    100.78  |  0;    //  100
    100.45 >>  0;    //  100
    100.50 <<  0;   // 100
    100.96 >>> 0;    //  100

    对于其他类型,先使用 Number() 转换为数值类型,再进行位运算。

    ~~ '100.12'  // 100, Number('100.12') == 100.12
    '100.50'  >> 0;  // 100,Number('100.50') == 100.50
    '100.96'  << 0;  // 100,Number('100.96') == 100.96
    ~~ 'abc'  // 0 , Number('abc') == NaN
    '12abc'  >> 0;  // 0, Number('12abc') == NaN
    undefined | 0 ; // 0, Number(undefined) == NaN
    ~~null;      // 0 , Number(null) == 0
    true >> 0; // 1 , Number(true) == 1
    false >> 0; //0 , Number(false) == 0
    []  << 0;     // 0 , Number([]) == 0
    ~~NaN; // 0 
    Infinity >>> 0; // 0
    

    位运算作用于最基本的层次上,即按内存中表示数值的位来操作数值。

    位运算能取整的原因是:

    ECMAScript 中的数值以64位双精度浮点数存储,但位运算只能作用于整数,因此要先将 64 位的浮点数转换成 32 位的整数,然后再进行位运算,最后再将计算结果转换成64位浮点数存储。

    原创发布 @ 一像素  2018.06

  • 相关阅读:
    webdav srs相关
    How To Configure WebDAV Access with Apache on Ubuntu 14.04
    ubuntu 编译lighttpd
    srs编译及推流测试
    Compile pciutils (lspci, setpci) in Windows x86,在 Windows x86 平台下编译 pciutils (lspci, setpci)
    mingw MSYS2 区别
    Qt之美(三):隐式共享
    Qt之美(二):元对象
    Qt之美(一):d指针/p指针详解
    C++的栈空间和堆空间
  • 原文地址:https://www.cnblogs.com/onepixel/p/5141566.html
Copyright © 2011-2022 走看看