码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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
    • 2
    • 3
    • 4

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


    原理

    死记硬背~~~。

    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);
    
    • 1
    • 2
    • 3

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


    十进制小数转二进制

    方法:小数乘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

  • 相关阅读:
    Log4j2再发新版本2.16.0,完全删除Message Lookups的支持,加固漏洞防御
    Docker Compose 容器编排
    幸运彩票 分数 15作者 陈越单位 浙江大学
    Linux 进程概念 —— 冯 • 诺依曼体系结构
    spring源码解析——IOC-开启 bean 的加载
    Elasticsearch:基于 Langchain 的 Elasticsearch Agent 对文档的搜索
    [每周一更]-(第63期):Linux-nsenter命令使用说明
    Spring Boot 还在用 if 校验参数?
    用于单细胞多组学整合的无监督拓扑对齐方法
    【云原生】原来2020.0.X版本开始的OpenFeign底层不再使用Ribbon了
  • 原文地址:https://blog.csdn.net/cs492934056/article/details/133919898
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号