web前端面试-- IEEE754标准JS精度丢失问题0.1+0.2!=0.3、0.2+0.3==0.5 十进制转二进制讲解

本文主要是介绍web前端面试-- IEEE754标准JS精度丢失问题0.1+0.2!=0.3、0.2+0.3==0.5 十进制转二进制讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本人是一个web前端开发工程师,主要是vue框架,整理了一些面试题,今后也会一直更新,有好题目的同学欢迎评论区分享 ;-)

web面试题专栏:点击此处

![在这里插入图片描述](https://img-blog.csdnimg.cn/3c22340ec77044eaba7196c88737821d.png


背景

WEB前端面试官:0.2+0.3是否等于0.5?
:)

好家伙,不按套路出牌,之前也没深究,但是既然重新学习一下,就记录一下,免得又忘记了。

分析问题

面试官是问你0.1+0.2,或者0.2+0.3的问题吗?
不是的,要是下次有个作妖的问你,0.x+0.y呢?
显然不是,他要问你的是原理~

0.1+0.2
// 0.30000000000000004
0.2+0.3
// 0.5

控制台运行如下:
在这里插入图片描述


原理

死记硬背~~~。

  1. 在浏览器的JavaScript环境中,遵循IEEE 754标准,就算记不全,也要记得IEEE(理科生搞得跟文科生一样,真蛋疼。。。)
  2. 这个标准规定了浮点数的二进制表示以及浮点数的运算规则。
  3. JavaScript中的Number类型就是基于这个标准实现的。因此,JavaScript中的浮点数遵循IEEE 754标准的规定,也会出现浮点数精度问题。

总的来说:IEEE754标准下,浮点数是用二进制进行存储运算的,部分十进制小数转成二进制是一个无限循环的数值,运算的时候会造成精度丢失。


复现

在浏览器环境中以IEEE754存储的0.1、0.2、0.3 咱们可以直接在控制台打印出来。

0.1.toString(2);
0.2.toString(2);
0.3.toString(2);

控制台运行如下:
在这里插入图片描述


十进制小数转二进制

方法:小数乘2取整,直到没有小数为空,最后取整的数值进行正向排列就得到了。
以0.1 为例:

数值取整
0.1 * 2 = 0.20
0.2 * 2 = 0.40
0.4 * 2 = 0.80
0.8 * 2 = 1.61
0.6 * 2 = 1.21
0.2 * 2 = 0.40
0.4 * 2 = 0.80
0.8 * 2 = 1.61
0.6 * 2 = 1.21
0.2 * 2 = 0.40
0.4 * 2 = 0.80
0.8 * 2 = 1.61
0.6 * 2 = 1.21
(无限循环)…

正向排列整理后: 0001100110011…

十进制证书转二进制

方法:整数除2取余,直到整数为0,最后取余的数值进行倒叙排列就得到了。
以6为例:

数值余数
6 / 2= 3 % 00
3 / 2 = 1 % 11
1 / 2 = 0 % 11

倒叙排列整理后: 110

这篇关于web前端面试-- IEEE754标准JS精度丢失问题0.1+0.2!=0.3、0.2+0.3==0.5 十进制转二进制讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/243151

相关文章

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详