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

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

web面试题专栏:点击此处


背景

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

:)

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

分析问题

面试官是问你0.1+0.2,或者0.2+0.3的问题吗?

不是的,要是下次有个作妖的问你,0.x+0.y呢?

显然不是,他要问你的是原理~

js 复制代码
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 咱们可以直接在控制台打印出来。

js 复制代码
0.1.toString(2);
0.2.toString(2);
0.3.toString(2);

控制台运行如下:


十进制小数转二进制

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

以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.4 * 2 = 0.8 0
0.8 * 2 = 1.6 1
0.6 * 2 = 1.2 1
0.2 * 2 = 0.4 0
0.4 * 2 = 0.8 0
0.8 * 2 = 1.6 1
0.6 * 2 = 1.2 1
(无限循环)... ...

正向排列整理后: 0001100110011...

十进制证书转二进制

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

以6为例:

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

倒叙排列整理后: 110

相关推荐
綝~2 小时前
爬虫数据采集工程师岗位面试题
爬虫·面试·请求
8Qi83 小时前
LeetCode 1143 & 718:最长公共子序列 / 最长重复子数组
算法·leetcode·职场和发展·动态规划
乐观的山里娃6 小时前
【反八股 01】HashMap 的设计参数是怎么来的
面试
嵌入式ZYXC6 小时前
第3篇:《面试题:I2C为什么要加上拉电阻?阻值怎么选?》
stm32·单片机·嵌入式硬件·面试·职场和发展
sbjdhjd7 小时前
面试(5)| 3.5 小时面试复盘第五弹:加班出差 + 客户响应 + 压力面全拆解
经验分享·程序人生·面试·职场和发展·开源·跳槽·求职招聘
AI人工智能+电脑小能手8 小时前
【大白话说Java面试题 第102题】【并发篇】第2题:volatile 能否保证线程安全?
java·安全·面试
Patrick_Wilson9 小时前
Git Worktree 原理详解:从 objects / refs 看懂多分支并行与多 Agent 协作
git·面试·ai编程
Moment9 小时前
我做了一套前端也能学懂的 AI Agent 系列,从 Prompt 一路讲到多 Agent 😍😍😍
前端·后端·面试
小欣加油10 小时前
leetcode2161 根据给定数字划分数组
数据结构·c++·算法·leetcode·职场和发展
中小企业实战军师刘孙亮10 小时前
快消纺织五金怎么融合?三大业态协同发展战略思路-佛山鼎策创局破局增长咨询
学习·面试·创业创新·制造·学习方法