前言

  此文整理了JavaScript中常见的浮点数取整函数,当然也包括一些更为高效的位操作取整。

Math.trunc

  Math.trunc 用于返回数字的整数部分。

Math.trunc(-11.25) // -11
Math.trunc(NaN) // NaN
Math.trunc(Infinity) // Infinity
Math.trunc() // NaN

  Math.trunc内部也会调用Number将参数隐式转换为数值,然后再取整。

const object = {valueOf() {return 11.25}
}
Math.trunc(object) // 11

Math.round

  Math.round 用于四舍五入取整。

Math.round(-11.25) // -11
Math.round(NaN) // NaN
Math.round(Infinity) // Infinity
Math.round() // NaN
Math.round({ valueOf() { return 11.25 } }) // 11

Math.ceil

  Math.ceil 用于向上取整。

Math.ceil(-11.25) // -11
Math.ceil(NaN) // NaN
Math.ceil(Infinity) // Infinity
Math.ceil() // NaN
Math.ceil({ valueOf() { return 11.25 } }) // 12

Math.floor

  Math.floor 用于向下取整。

Math.floor(-11.25) // -12
Math.floor(NaN) // NaN
Math.floor(Infinity) // Infinity
Math.floor() // NaN
Math.floor({ valueOf() { return 11.25 } }) // 11

parseInt / Number.parseInt

  parseInt也能用于取整,只取出参数的整数部分。

ES6中将全局方法parseInt移植到了Number上,Number.parseInt 与 parseInt 函数行为是一样的

Number.parseInt(11.25) // 11
Number.parseInt(Infinity) // NaN
Number.parseInt(NaN) // NaN
Number.parseInt() // NaN

  另外parseInt会将参数转换为字符串,将忽略字符串开头的空白符,从不是空格的字符开始处理,若第一个字符不是+-或者数字,将返回NaN,否则一直处理到不是数字字符为止。

Number.parseInt(' -11.25a') // -11
Number.parseInt('a11') // NaN
Number.parseInt({ toString() { return 11.25 } }) // 11

Number.prototype.toFixed

  Number.prototype.toFixed 可以用来格式化数值,当然也可以用来取整,并且根据小数位来决定四舍五入。

(-11.25).toFixed() // "-11"
(-11.55).toFixed() // "-12"

  但是注意toFixed可能会存在错误。

(1.005).toFixed(2) // "1.00"

位操作

  位运算中,参与运算的两个值会被转为有符号32位二进制数值(>>>无符号右移除外,会被转为无符号类型),超过32位的数值会被截断,而小数部分则会被舍弃

有符号32位的整型数值包括1个符号位和31个数值位,可表示的整数范围为[-(2 ^ 31 - 1), 2 ^ 31 - 1],即[-2147483647, 2147483647]。但是注意由于负数的表示方式为补码,1000 0000 0000 0000 0000 0000 0000 0000-0)用来表示-2147483648,因此有符号的32位整型数的表示范围为[-2147483648, 2147483647]

  例一,数值42949672972 ^ 32 + 2 ^ 0)与0或,其中左边第一位为符号位,结果中左边第一二位被截掉。

  01 0000 0000 0000 0000 0000 0000 0000 0001 // 4294967297
|    0000 0000 0000 0000 0000 0000 0000 0000 // 00000 0000 0000 0000 0000 0000 0000 0001 // 1

  例二,数值21474836482 ^ 31)与0或,结果中左边第一位符号位截掉。

  0 1000 0000 0000 0000 0000 0000 0000 0000 // 2147483648
|   0000 0000 0000 0000 0000 0000 0000 0000 // 01000 0000 0000 0000 0000 0000 0000 0000 // -2147483648

1000 0000 0000 0000 0000 0000 0000 0000在有符号的32位中表示-2147483648

  例三,数值-2147483649-(2 ^ 31 + 2 ^ 0))的二进制表示。

1 1000 0000 0000 0000 0000 0000 0000 0001 // 原码
1 0111 1111 1111 1111 1111 1111 1111 1110 // 反码
1 0111 1111 1111 1111 1111 1111 1111 1111 // 补码

  与0或,结果中左边第一位符号位被截掉。

  1 0111 1111 1111 1111 1111 1111 1111 1111 // -2147483649
|   0000 0000 0000 0000 0000 0000 0000 0000 // 00111 1111 1111 1111 1111 1111 1111 1111 // 2147483647

x|0

  与0进行或运算。

-11.25|0 // -11

  小数部分被舍弃。

  1000 0000 0000 0000 0000 0000 0000 1011 // -11
| 0000 0000 0000 0000 0000 0000 0000 0000 // 01000 0000 0000 0000 0000 0000 0000 1011 // -11

x&-1

  与-1进行与运算

-11.25&-1 // -11

  -132位二进制表示。

1000 0000 0000 0000 0000 0000 0000 0001 // 原码
1111 1111 1111 1111 1111 1111 1111 1110 // 反码
1111 1111 1111 1111 1111 1111 1111 1111 // 补码

  小数部分被舍弃。

  1000 0000 0000 0000 0000 0000 0000 1011 // -11
& 1111 1111 1111 1111 1111 1111 1111 1111 // -11000 0000 0000 0000 0000 0000 0000 1011 // -11

x^0

  与0异或。

-11.25^0 // -11

  小数部分被舍弃。

  1000 0000 0000 0000 0000 0000 0000 1011 // -11
^ 0000 0000 0000 0000 0000 0000 0000 0000 // 01000 0000 0000 0000 0000 0000 0000 1011 // -11

异或^可以想象为按位相加,但是不进位。比如0^0=0想象为0+0=00^1=1想象为0+1=1,而1^1想象为1+1=(1)0,不进位则为0

~~x

  双非运算。

~~-11.25 // -11

  小数部分被舍弃。

   1000 0000 0000 0000 0000 0000 0000 1011 // -11
~  0111 1111 1111 1111 1111 1111 1111 0100
~~ 1000 0000 0000 0000 0000 0000 0000 1011 // -11

x^n^n

  两次异或一个数。

-11.25^3^3 // -11

注意n^n=0,不管是0^0还是1^1,结果都是0。因此x^n^n等价于x^0

x<<0

  有符号左移0位,虽然没有进行移位,但是小数部分被舍弃。另外有符号移位意味着符号位保留不参与移位,只移动其余31位。

-11.25<<0 // -11

  11左移1位。

0000 0000 0000 0000 0000 0000 0000 1011 // 11
0000 0000 0000 0000 0000 0000 0001 0110 // 22

  -11左移1位。

1111 1111 1111 1111 1111 1111 1111 0101 // -11
1111 1111 1111 1111 1111 1111 1110 1010 // -22

正负数左移空位都是补0,另外<<左移n位相当于乘以2^n倍。用一个十进制数来做类比,20左移2位为2000,相当于20乘以10^2倍,也就是100

x>>0

  有符号右移0位。

-11.25>>0 // -11

  -1132位二进制表示。

1000 0000 0000 0000 0000 0000 0000 1011 // 原码
1111 1111 1111 1111 1111 1111 1111 0100 // 反码
1111 1111 1111 1111 1111 1111 1111 0101 // 补码

  -11右移1位。

1111 1111 1111 1111 1111 1111 1111 0101 // -11
1111 1111 1111 1111 1111 1111 1111 1010 // -6

  11右移1位。

0000 0000 0000 0000 0000 0000 0000 1011 // 11
0000 0000 0000 0000 0000 0000 0000 0101 // 5

注意负数右移空位补1,正数右移空位补0。另外>>右移n位相当于除以2^n倍,然后再向下取整(类似Math.floor)。

x>>>0

  无符号右移0位。

11.25>>>0 // 11

  但是无符号右移>>>只适用于正数的取整。

-1>>>0 // 4294967295

  出现以上现象是由于,Javascript会在移位之前做两种转换,第一是将非数值类型转换为0,第二则是将数值转换为无符号的32位二进制。

  第一种转换。

null>>>0 // 0const fn = () => {}
fn>>>0 // 0

  第二种转换可以理解为,-1的有符号的32位二进制表示为。

1111 1111 1111 1111 1111 1111 1111 1111 // -1

  然后JavaScript会使其符号位失效,或者说符号位上的1不再用来表示负号,而是充当数值位,因此1111...1111转换为十进制为4294967295Math.pow(2,32) - 1)。

>>>0右移0位的作用。

  • 将任何非数值转换为0
  • 取出非负数的整数部分

  既然>>>使符号位失效了,那么可以使其再生效吗?

  当然,进行普通的位运算从而将其转换为有符号的32位数值。

-1>>>0|0 // -1
-1>>>0&-1 // -1
-1>>>0^0 // -1
~~(-1>>>0) // -1
(-1>>>0)>>0 // -1

JavaScript 浮点数取整相关推荐

  1. Python 关于浮点数取整详解

    Python 关于浮点数取整详解 文章目录 Python 关于浮点数取整详解 一.四舍五入 二.向下取整 三.向上取整 四.截取整数和小数部分 五.扩展:浮点数精度问题 相关博客

  2. bcmul 浮点数取整问题

    http://php.net/manual/zh/function.bcmul.php 可以解决浮点数取整问题,最好还是避免浮点运算,转为整数运算.

  3. Matlab | Matlab从入门到放弃(9)——浮点数取整

    博主github:https://github.com/MichaelBeechan 博主CSDN:https://blog.csdn.net/u011344545 代码下载:https://gith ...

  4. html控制台随机数取整,获取随机数、浮点数取整方法

    Math.(random/round/cell/floor)随机数的用法 Math.random()      返回值是一个大于等于0,且小于1的随机数 Math.random()*N    返回值是 ...

  5. JavaScript 常用取整、四舍五入方法汇总

    向下取整: Math.floor 例如:Math.floor (1.1), Math.floor (-1.1) 向上取整: Math.ceil 例如:Math.ceil (1.1), Math.cei ...

  6. JS笔记之--Javascript的取整、取商、取模、取余

    js的取整(取商) parseInt(6/4) --> 1 (取商) //向上取整 Math.ceil(1.1) --> 2 //向下取整 Math.floor(1.9) --> 1 ...

  7. opencv 浮点数取整 cvFloor cvRound cvCeil 比较

    http://www.voidcn.com/article/p-fdbhdzxi-vg.html 函数 cvRound, cvFloor, cvCeil 用一种舍入方法将输入浮点数转换成整数. cvR ...

  8. php浮点转int少1,PHP中浮点数计算比较及取整不准确的解决方法

    显然在这里,实际上作为浮点型数据,其精度已经损失了一部分,达不到完全精确.所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等.需要说明的是,这不是PHP的问题,而是计算机内部 ...

  9. C++ 取整,四舍五入

    将浮点数取整或者四舍五入的数据处理情况经常见到,下面做一下总结 注意函数取整返回值均为double型,在用printf输出时应注意 头文件#include<cmath> #include& ...

最新文章

  1. In Gradle projects, always use http://schemas.andr
  2. Unity Camera的两种模式
  3. 如何判断一颗二叉树为完全二叉树
  4. 文本标注工具——doccano
  5. 17、关于hibernate的N+1问题
  6. SSH config 文件的作用
  7. 零基础java自学流程-Java语言高级531
  8. python 自动下载网页链接_用python做一个网页自动下载脚本
  9. SSD目标检测(Single Shot MultiBox Detector)(一)
  10. 用户画像项目两大核心内容之一“one_id”(含SQL实现代码)
  11. EndNote使用教程
  12. PDF文件编辑指南4:PDF文档加密和移除PDF文档密码方法
  13. hbase命令使用笔记
  14. 基于kali的一次无线渗透测试
  15. javaweb与web前端的区别
  16. SpotlessCity:第一个干洗服务网站 反映纽约人有多懒
  17. 《The Art Of Effective Rigging In Blender》笔记:Leg Pole Target设置
  18. 灰度图像的中值滤波取证
  19. Ubuntu:20.04 安装python3.6
  20. Web3术语大全(小白轻松入门Web3)建议收藏

热门文章

  1. android js shell,使用adb shell+node.js实现抖音自动抢红包
  2. imx6ull开发板各个功能测试
  3. DataGridView 选中一行后,保持前景色(颜色,字体)不变
  4. C语言作业——飞机订票系统设计
  5. 【MFC】SetWindowPos函数使用详解
  6. 《JVM调优》- Jstack指令详解
  7. 个人DIY一套全智能机器人基本流程
  8. 开箱即用,超实用的 Vue 自定义指令合集
  9. python import from egg文件_python egg怎么安装
  10. Linux查看端口占用情况