js 的 二进制
1. 整数
例如十进制的 30
30/2 .......... 0
15/2 ............ 1
7/2 ............ 1
3/2 .............. 1
1/2 .............. 1
所以得到结果是 从下往上,倒着排 11110 就是二进制的 30
2. 小数
例如十进制的 0.125
0.125*2=0.25 ............. 0
0.25*2=0.5 ............. 0
0.5*2=1 ............. 1
所以得到结果是 从上往下,顺着排 0.001 就是二进制的 0.125
3.为什么 0.1 + 0.2 !== 0.3 ?
因为 JS 采用了 IEEE 754 双精度版本(64位), 只要采用了 IEEE 754 的语言都会有这个问题。
从上面我们看到,二进制的小数是怎么算的,而这种结果很可能会导致无限循环。
例如十进制的 0.1
0.1*2=0.2 .......... 0
0.2*2=0.4 .......... 0
0.4*2=0.8 .......... 0
0.8*2=1.6 .......... 1
0.6*2=1.2 .......... 1
0.2*2=0.4 .......... 0
。。。
所以得到结果是 从上往下,顺着排 0.00011(0011不断循环) 就是二进制的 0.1
因为我们不可能把 0.1 的无限循环都记录下来,所以 0.1 在 JS 引擎里面被截取了前面的部分
因此 0.1 在 JS 引擎里面不再精确地表示 0.1 了。
同样 0.2 也有或者这个问题,所以 2 个非精确的小数相加,也就得到一个非精确的小数了。
ps: 认真数了一下,JS 到小数点后第18位,就完全忽略了。
JS Number 类型的二进制组成
根据国际标准 IEEE 754,JavaScript 浮点数的64个二进制位,从最左边开始,是这样组成的。
- 第1位:符号位,
0表示正数,1表示负数 - 第2位到第12位(共11位):指数部分 (表示 2^−1022~2^1023)
- 第13位到第64位(共52位):小数部分(有效数字,可以到53位精度)
疑问1:为什么明明52位,为什么可以表示53位精度?
IEEE754规定小数部分第一位隐含为1,不写,因为所有二进制第一个有效数字都是1。
所以加上省略的1位,精度位数是 53 bit。所以在 0 ~ 2^53 内的整数都是有效数字,算上第1位符号位,就可以得到 -2^53 ~ 2^53 都是有效数字。
疑问2:为什么 11 位指数位,负数方向只能表示到 2^-1022 ,不能表示到 2^-1024 呢?
无论如何浮点数都满足最左边是 1。这就有一个严重问题:0没有办法被表示,因此指数为 -1023 时表示 0。
还有一种情况就是 Infinity,这种情况当指数是 -1024 时,表示无穷大
js 的 二进制的更多相关文章
- 第六章 MVC之 FileResult和JS请求二进制流文件
一.FileResult 1.简介 表示一个用于将二进制文件内容发送到响应的基类.它有三个子类: FileContentResultFilePathResultFileStreamResult 推荐阅 ...
- [JavaScript]为JS处理二进制数据提供可能性的WEB API
写这篇博客的起源是在div.io上的一篇文章<你所不知道的JavaScript数组>by 小胡子哥下的评论中的讨论. 因为随着XHR2和现代浏览器的普及,在浏览器当中处理二进制不再向过去那 ...
- 聊聊JS的二进制家族:Blob、ArrayBuffer和Buffer
事实上,前端很少涉及对二进制数据的处理,但即便如此,我们偶尔总能在角落里看见它们的身影. 今天我们就来聊一聊前端的二进制家族:Blob.ArrayBuffer和Buffer 概述 Blob: 前端的一 ...
- JS中二进制与十进制的相互转换
今天在做题目的时候遇到了需要十进制转换为二进制,这个我知道用toString可以,但是二进制转换为十进制我一下子就想不起来,网上搜了下,才知道是parseInt可以实现,特此记录下. 十进制转换为二进 ...
- js中从blob提取二进制
文章结构: 一.所遇到的问题 二.解决方法 一. 服务器端通过websocket向浏览器端传输图片(二进制),需要根据不同的图片把图片显示在不同的位置,可行的一个方法是先把图片转化成二进制数组,再把二 ...
- io.js入门(二)—— 所支持的ES6(上)
io.js的官网上有专门介绍其所支持的ES6特性的页面(点我查看),上面介绍到,相比nodeJS,io.js已从根本上支持了新版V8引擎上所支持的ES6特性,无需再添加任何运行时标志(如 --harm ...
- Node.js快速入门
Node.js是什么? Node.js是建立在谷歌Chrome的JavaScript引擎(V8引擎)的Web应用程序框架. 它的最新版本是:v0.12.7(在编写本教程时的版本).Node.js在官方 ...
- 读书笔记-你不知道的JS上-对象
好想要对象··· 函数的调用位置不同会造成this绑定对象不同.但是对象到底是什么,为什么要绑定他们呢?(可以可以,我也不太懂) 语法 对象声明有两个形式: 1.字面量 => var obj = ...
- Node.js Buffer
Buffer(缓冲区) JavaScript 语言自身只有字符串数据类型,没有二进制数据类型. 但在处理像TCP流或文件流时,必须使用到二进制数据.因此在 Node.js中,定义了一个 Buffer ...
随机推荐
- Kettle部署笔记
1.启动脚本(启动job) /u02/www/data-integration/kitchen.sh -file:/u02/www/data-integration/job.kjb -logfile= ...
- 采用二进制方式安装K8S集群,版本etcd-v3.3.10,flannel-v0.11.0,kubernetes-server-linux-amd64
官方提供的几种Kubernetes部署方式 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用.不能用于生产环 ...
- JAVA实现种子填充算法
种子填充算法原理在网上很多地方都能找到,这篇是继上篇扫描线算法后另一种填充算法,直接上实现代码啦0.0 我的实现只是实现了种子填充算法,但是运行效率不快,如果大佬有改进方法,欢迎和我交流,谢谢! 最后 ...
- PowerShell将运行结果保存为文件
1. Out-File 示例: get-process | Out-File -filepath a.txt 跟“>”是一样的效果 输出 为普通文本 2. Export-Clixml 示例: g ...
- Windows Mobile设备中心不能正常运行
1.开始-->运行,输入services.msc回车 2.在打开的服务界面中,找到“基于Windows Mobile 2003的连接设备” 3.打开的属性 ,找到登录项,登录身份选择“本地系统账 ...
- 图片上传怎么用File接受文件
xl_echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.——这才是真正的堪称强大!! - ...
- restTemplate源码解析(目录)
restTemplate是spring实现的,基于restful风格的http请求模板.使用restTemplate可以简化请求操作的复杂性,同时规范了代码风格.本系列文章,将根据以下目录顺序,从源码 ...
- Android NDK 学习之接受Java传入的Int数组
本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse-> ...
- dubbo和mq的使用场景
MQ:消息队列.生产者消费者模式,可用于对消息实时性要求不高的场景.多进程之间间接调用关系 Dubbo:RPC实现.多进程之间直接调用关系 dubbo 1,rpc的分布式集群支持:负载均衡是对外提供一 ...
- nginx 之高级模块
secure_link_module 模块 作用: 制定并允许检查请求的链接的真实性以及保护资源免遭未经授权的访问 限制链接生效周期 配置语法 Syntax:secure_link expressio ...