0.1 + 0.2 !== 0.3 就是要说清楚因为个啥?

2024-01-02 19:38
文章标签 0.1 清楚 0.2 要说 0.3

本文主要是介绍0.1 + 0.2 !== 0.3 就是要说清楚因为个啥?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

javascript(简称js)中的数字使用的是国际标准 IEEE 754,因为js是弱类型语言,为了方便省事,所有数字都是以64位浮点数形式储存。也就是说,js语言底层根本没有整数,所有数字都是小数(64位浮点数)!

当我们开心的进行着整数计算的时候,其实js都在算小数(莫名悲伤)。

整数算起来时没有问题的,但当你直接计算小数的时候,就麻烦了:0.1+0.2 不等于0.3

1 + 2 === 3 //true

0.1 + 0.2 === 0.3 //false

0.1 + 0.2 // 0.30000000000000004

这坑咋回事?

原来,0.1是十进制的,转成2进制以后,就是一个无限循环小数了!简单来说,就是2进制里表示1/10的难度跟你在10进制里表示1/3是一样一样的。

十进制的0.1用二进制表示为:0.0 0011 0011 0011 0011…,循环部分是0011

同样的0.2就是1/5

十进制0.2用二进制表示为:0.0011 0011 0011 0011…,循环部分是0011

上边我们也说了,用的这个标准,叫IEEE 754,这个标准里边,最多存52个尾数,也就是转换为科学记数法以后,尾数最多52个,循环小数到这里就被切断了,只留下前边52位。

那这两个浮点数就不准了啊,就有误差了,带着这两个误差进行加法计算,得到的数也就不准了,所以才会出现

0.1 + 0.2 !== 0.3 //true

反过来说,但凡用二进制表示一个浮点数时,出现了无理数的情况,这个浮点数运算都是不准的。

哪些浮点数会变成二进制里的无理数?一个一个记住太麻烦了,只要记住,只要用js算浮点数就会有误差就好了!

那么问题来了,我们如果要用浮点数计算,怎么搞定这个误差呢?

可以设置一个你可以接受的计算精度来完成啦。es6里新增的Number.EPSILON就可以实现啦,这个值就代表了2的负52次方啦

let yourSet = 52 - 10; //精度设置为小数点后10位小数
let yourTolerance = Number.EPSILON * Math.pow(2, yourSet);

只要保证计算结果误差小于你设置的误差就好了,或者你可以直接用toFixed来去掉多余的小数位哦。

不知道各位同学搞明白了吗?

这篇关于0.1 + 0.2 !== 0.3 就是要说清楚因为个啥?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C#设计模式(1)——单例模式(讲解非常清楚)

一、引言 最近在学设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二同时可以给一些初学设计模式的朋友一些参考。首先我介绍的是设计模式中比较简单的一个模式——单例模式(因为这里只牵涉到一个类) 二、单例模式的介绍 说到单例模式,大家第一

【JavaScript】0.1 + 0.2 = 0.30000000000000004该怎样理解?

如果你以前没了解过类似的坑,乍一看似乎觉得不可思议。但是某些语言下事实确实如此(比如 Javascript): 再看个例子,+1 后居然等于原数,没天理啊! 如果你不知道原因,跟着楼主一起来探究下精度丢失的过程吧。 事实上不仅仅是 Javascript,在很多语言中 0.1 + 0.2 都会得到 0.30000000000000004,为此还诞生了一个好玩的网站 0.30000000

Day18_0.1基础学习MATLAB学习小技巧总结(18)——MATLAB绘图篇(1)

利用空闲时间把碎片化的MATLAB知识重新系统的学习一遍,为了在这个过程中加深印象,也为了能够有所足迹,我会把自己的学习总结发在专栏中,以便学习交流。 参考书目:《MATLAB基础教程 (第三版) (薛山)》 之前的章节都是基础的数据运算用法,对于功课来说更加重要的内容是建模、绘图、观察数据趋势,接下来我会结合自己的使用经验,来为大家分享绘图、建模使用的小技巧。 二维图形绘制 在本章开

Day17_0.1基础学习MATLAB学习小技巧总结(17)——字符向量元胞数组

利用空闲时间把碎片化的MATLAB知识重新系统的学习一遍,为了在这个过程中加深印象,也为了能够有所足迹,我会把自己的学习总结发在专栏中,以便学习交流。 素材来源“数学建模清风” 特此说明:本博客的内容只在于总结在使用matlab中的一些小技巧,并非教程,若想系统的学习MATLAB,也可以移步去链接中的视频,观看学习。也欢迎各位在留言区补充,纠错,讨论。 原素材和学习视频地址:MATLAB教程

127.0.0.1与本机ip的区别

127.0.0.1是回送地址,指本地机。 127.0.0.1是用来检测网络的自己的IP.就是说任何一台电脑来说,不管是否连接到INTERNET上,127.0.0.1对于自己来说都是自己.就是说,每台电脑都是由4位的256进制数组成的. 而192.168.1.102现在是本机,但本机也可以设置成其他ip地址,但127.0.0.1一定是指本机。 多人会接触到这个ip地址127.0.0.1。也许

一次性说清楚,微软Mos国际认证

简介: Microsoft Office Specialist(MOS)中文称之为“微软办公软件国际认证”,是微软为全球所认可的Office软件国际性专业认证,全球有168个国家地区认可,每年有近百万人次参加考试,它能有效证明Word、Excel、PPT、Acess等办公软件技能,是目前企业招聘者建立筛选的标准之一,尤其在外企,相对于国内人手一本的计算机二级证书,MOS认证显得更权威! 考试版

重要的事情要说很多遍

前两天一个读者朋友和我分享了一个情况,就是他的知乎账号被连续两次封禁,上次7天,这次30天。   我简单了解下情况,大概得出了结论,应该是文章被判恶意营销了,因为他最被举报的文章标题都是这种:   “XX产品推荐,只看这一款/两款就够了”   不管一款两款,放的都是一个品牌旗下的产品,所以我一眼就觉得是因为恶意营销被举报,所以让这个读者去和知乎的客服确认一下,验证一下我这个想法对不对。

在JIRA上提交缺陷,如何描述清楚?

提交bug遵循的原则: 1、简洁、易懂、便于复现。 2、环境一定要写。

错误信息 connect() to 127.0.0.1:8000 failed (13: Permission denied)解决办法

错误信息 connect() to 127.0.0.1:8000 failed (13: Permission denied) 通常表示 Nginx 被阻止连接到运行在端口 8000 上的 Django 应用程序。这可能由于多个原因导致,最常见的是 SELinux 或防火墙设置的问题。 1. SELinux 配置 CentOS 通常启用 SELinux(Security-Enhanced Li

k8s dial tcp 10.97.0.1:443: i/o timeout

问题 使用 kubeadm 部署完 k8s ,使用 projectcalico/tigera-operator 这个 chart 部署 calico ,卡在了 tigera-operator 这个 namespace 下的 pod tigera-operator-54b47459dd-n4x72,该 pod 一直重启,查看该 pod 日志发现如下报错 kubectl logs -f tige