为什么会有0.1+0.2不等于0.3的问题

15 篇文章 1 订阅
订阅专栏

 出现这个情况的根本原因是因为计算机是二进制文件处理数据,我们知道数学数据类型有有理数、无理数、虚数。计算机只能处理二进制。所以对于无理数、分数、有限循环小数计算机是没办法进行二进制表示的。即使是有理数,计算机也很难用二进制全部表示。例如有理数,小数0.1。

十进制小数转成二进制小数的原理:

十进制小数转换成二进制小数采用"乘2取整,顺序排列"法。具体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数 部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。

然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位。

按照上述规则:对0.1进行二进制表示0.0001100110011...。0011会无限循环下去。你看计算机存储数据弱爆了。连个0.1都表达不了。这样就导致其进行数据计算时,存在精度丢失的情况。也就是我们常见的0.1+0.2\neq0.3。

 十进制整数转换成二进制

十进制整数转换为二进制整数采用"除2取余,逆序排列"法。具体做法是:用2去除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为零时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。即运算结果逆序排序

 拓展:10.1 的二进制表示

整数部分按照整数部分二进制表示,小数部分按照小数规则表示,然后把整数部分和小数部分合并起来。

10.1的二进制表示为1010.0001100110011....。

Javascript中为什么0.1+0.2 不等于 0.3?怎么解决?
qq_45042330的博客
04-02 2287
console.log(0.1+0.2) // 0.30000000000000004 原因:在js中将0.10.2转换为二进制数,其实并不是十分精确。所以0.1+0.2 !==0.3 解决方法: 最好的方法是设置一个误差范围值,通常称为”机器精度“。 ES6 在Number对象上面,新增一个极小的常量Number.EPSILON。根据规格,它表示 1 与大于 1 的最小浮点数之间的差。 对于 64 位浮点数来说,大于 1 的最小浮点数相当于二进制的`1.00..001`,...
python中0.1+0.2为啥不等于0.3_你真的知道0.1+0.2为何不等于0.3吗?
weixin_36162235的博客
02-03 2739
打开chrome控制台,给一个特别简单的输入如下:0.1+0.2//0.30000000000000004复制代码不知道你有没有吃惊,这么简单的一个计算,无论在js中还是在python中,都不是准确的0.3,这是为什么呢?缘起要了解这个问题,首先我们需要知道浮点数在计算机中到底是如何进行存储的?不知道你是怎么想的,总之我开始的第一反应就是假设是32位的存储空间,我可能按照整数的存储方式...
二进制与十进制的相互转换(小数)
yundanfengqing_nuc的专栏
04-16 1325
1、十进制数转换为二进制(小数) a)十进制数的整数部分:  十进制整数转换为二进制整数采用"除2取余,逆序排列"法。具体做法是:用2去除十进制整数,可以得到一个商和余数;再用2去除商,又得到一个商和余数,如此进行,直到商为零时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。 b)十进制数的小数部分: 十进制小数转换成二进制小数采用"
为什么0.1+0.2不等于0.3
热门推荐
初夏0811的博客
02-09 2万+
首先来看一段诡异的代码: package org.sang.test; /** * @Author: chuxia0811 * @Date: 2021/2/9 22:55 * @Description : */ public class _01_02 { public static void main(String[] args) { float a = 0.1f; float b = 0.2f; System.out.println(a +
你真的知道0.1+0.2为何不等于0.3吗?
09-04 1720
打开chrome控制台,给一个特别简单的输入如下:0.1+0.2//0.30000000000000004复制代码不知道你有没有吃惊,这么简单的一个计算,无论在js中还是在python中,都不是准确的0.3,这是为什么呢?缘起要了解这个问题,首先我们需要知道浮点数在计算机中到底是如何进行存储的?不知道你是怎么想的,总之我开始的第一反应就是假设是32位的存储空间,我可...
【操作系统】为什么 0.1 + 0.2 不等于 0.3
flyersboy的博客
06-02 3387
一、为什么负数要用补码表示? 以 int 类型的数字作为例⼦,int 类型是 32 位的,其中最⾼位是作为「符号标志位」,正数的符号位是 0 ,负数的符号位是 1 ,剩余的 31 位则表示⼆进制数据。 那么,对于 int 类型的数字 1 的⼆进制数表示如下: ⽽负数就⽐较特殊了点,负数在计算机中是以「补码」表示的,所谓的补码就是把正数的⼆进制全部取反再加 1,⽐如 -1 的⼆进制是把数字 1 的⼆进制取反后再加 1,如下图: 那么,为什么计算机要⽤补码的⽅式来表示负数?**在回答这个问题前,我们假设不.
解决JavaScript中0.1+0.2不等于0.3问题
10-17
这就是为什么在JavaScript中`0.1 + 0.2`不等于`0.3`的原因。 为了正确地比较两个浮点数,我们需要引入一个误差范围,也就是所谓的“机器精度”。在JavaScript中,这个精度值可以通过`Number.EPSILON`属性获取,其值...
为什么JavaScript中0.1 + 0.2 != 0.3
01-21
涉及面试题:为什么 0.1 + 0.2 != 0.3?如何解决这个问题? 原因,因为 JS 采用 IEEE 754双精度版本(64位),并且只要采用 IEEE 754的语言都有该问题 我们都知道计算机是通过二进制来存储东西的,那么 0.1 在二进制...
python中0.1+0.2为啥不等于0.3_为什么0.1+0.2不等于0.3?原来编程语言是这么算的……...
weixin_34170028的博客
12-24 3672
打开你的 Python,输入「0.1+0.2=」,结果是多少?0.30000000000000004 对不对?为什么结果不是 0.3?本文作者给出了详细的解释。从小我们就知道 0.1 + 0.2=0.3。但是,在光怪陆离的计算世界中,运算方式却大相径庭。我最近开始用 JavaScript 进行编码,在阅读数据类型时,我注意到 0.1 + 0.2 不等于 0.3 的奇怪行为。我向 Stack Ove...
0.1 + 0.2 为什么不等于 0.3之小数精度问题
yyh1994的博客
03-03 1427
浮点数计算类,取二者中小数位数最长者(记为 N),同时乘以 10 的 N 次幂,转换为整数进行计算,再除以 N 次幂转回小数需要用 toFixed 取近似值的地方,可以先加上 1e-14 或 umber.EPSILON,再取。判定两个数字相等,可以使用 Math.abs(left - right) < Number.EPSILON实在不,就直接用别人写好的成熟库吧。
0.1+0.2 为什么不等于0.3
cherryfef的博客
11-22 1万+
0.1+0.2的计算过程 1、十进制转成二进制 在JS内部所有的计算都是以二进制方式计算的。所以运算 0.1+ 0.2 时要先把 0.10.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.1+0.2为什么不等于0.3
bug收集
06-02 642
面试时,经常被问到 0.1+0.2 结果是多少呢? 知道结果,肯定不是0.3 请看下图: 可原因就不太清楚了,本文就来讨论下 原因: 在于在JS中采用的IEEE 754的双精度标准,计算机内部存储数据的编码的时候,0.1在计算机内部根本就不是精确的0.1,而是一个有舍入误差的0.1。 当代码被编译或解释后,0.1已经被四舍五入成一个与之很接近的计算机内部数字,以至于计算还没开始,一个很小的舍入错误就已经产生了。 这也...
为什么 0.1+0.2 不等于 0.3
最新发布
weixin_42560424的博客
06-08 2813
位),而在这种格式下无法精确表示某些小数,因此在进行计算时出现精度误差。中,这些小数被转换成最接近它们的可表示值,然后再进行计算。被转换成的值可能存在精度误差,导致它们的和不等于。都是无限循环小数,无法用二进制精确地表示。中采用的是双精度浮点数格式(
JS精度问题 0.1+0.2为什么不等于0.3
ForwardGu的博客
06-24 180
JavaScript 精度
[解惑][无用的知识] 为什么0.1+0.2不等于0.3
大宝剑
02-27 598
第一次遇到这个问题的时候我还是一个在培训班学习PHP的懵懂少年。我记得当时老师说的原因是"因为PHP在处理浮点数的时候有问题"。哎,PHP还是不是全世界最好的编程语言了。 后来无意发现,何止是PHP,C,Java,JavaScript等等等等都有这样的问题。看来PHP还是这个世界上最好的编程语言。 因为是无用的知识,所以先说结论:无关语言,之所以出现这样的问题,是因为"有一些十进制小数无法转换成二进制数"。 下面详细说说这到底是为什么。 计算机如何用二进制表示小数 先来一张图说一下,如何把二进制小数101
为什么0.1+0.2=0.30000000000000004
weixin_30730151的博客
01-20 668
文章讨论了计算机中的浮点运算问题,给出了各种不同语言的浮点输出。 浮点数运算 你使用的语言并不烂,它能够做浮点数运算。计算机天生只能存储整数,因此它需要某种方法来表示小数。这种表示方式带来某种程度的误差。这就是为什么往往0.1 + 0.2 不等于 0.3。 为什么这样? 实际上很简单。对于十进制数值系统(就是我们现实中使用的),它只能表示以进制数的质因子为分母的分数。1...
3.为什么0.1+0.2不等于0.3 ?
宋坚强大大~~
05-05 334
1.在计算机中 存储都是2进制的, 数字计算时也先转换成2进制再进行计算 2.十进制 => 二进制 如何转化的? 0.1 可以把 0看做整数位 1看做是小数位 规则: * 整数位 当前位的值*2^(n-1) 当前位的值乘以2的n-1次密 * 小数位 把当前位的值不停的*2取整 1.举个整数的例子: 二进制数1010 => 0*2^0 + 1*2^1 + 0*2^2 + 1*2^3 = 0 + 2 + 0 + 8 = 10 不信你用 parseInt('1010', .
js中为什么0.1+0.2不等于0.3
05-26
具体来说,0.10.2 在二进制中无限循环,而 JavaScript 存储数字的精度只有 53 位,因此在进行计算时,出现精度损失。例如: ``` 0.1 + 0.2 = 0.30000000000000004 ``` 为了避免这种问题,可以使用一些方法来...
写文章

热门文章

  • IntelliJ IDEA中decompiled.class file bytecode version:50.0(java 6)问题 8024
  • 原码、反码、补码二进制表示 5757
  • 什么叫面向对象编程? 1909
  • JS布尔值(Boolean)转换规则 1555
  • SQL存储过程理解 1290

分类专栏

  • javaScript基础 15篇
  • git 1篇
  • jQuery源码解读 2篇
  • JavaScript设计模式 3篇
  • maven 1篇
  • java 8篇
  • spring 1篇
  • JVM
  • 数据库 3篇

最新评论

  • IntelliJ IDEA中decompiled.class file bytecode version:50.0(java 6)问题

    本参: 别介意,看过。略过,知道就行了。哈哈

  • IntelliJ IDEA中decompiled.class file bytecode version:50.0(java 6)问题

    wzx18373330053: 这几张图,,,,见过好几个不同的网站了,全是一样的图,包括红字,内容都是一样的,有18年的,有20年的,你这21年的还是这个,,,抄都抄这么晚

  • Maven入门

    本参: 项目打包的类型,可以使jar、war、rar、ear、pom,默认是jar

  • 什么叫面向对象编程?

    不正经的kimol君: 谢谢分享,很有用

  • 什么叫面向对象编程?

    编程界小明哥: 写的很棒学到了,欢迎来我博客指点江山

最新文章

  • Linux学习
  • js循环遍历
  • Arguments对象
2022年1篇
2021年32篇
2020年2篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

本参

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家商场环境美陈管理制度河南步行街玻璃钢雕塑平顶山抽象玻璃钢仿铜雕塑章鱼玻璃钢雕塑山西玻璃钢小品雕塑泰州儿童玻璃钢雕塑设计无锡商场新年美陈深圳兵马俑玻璃钢雕塑上海特色玻璃钢雕塑图片北京玻璃钢雕塑制造厂家营口玻璃钢仿铜雕塑北京商场美陈图片内蒙古玻璃钢人物雕塑厂家苏州商场大型美陈湖州玻璃钢卡通雕塑美陈商场的设计玻璃钢动物雕塑造型商场元宵节美陈许昌学校校园玻璃钢雕塑大同仿铜玻璃钢雕塑定制广西仿铜西式玻璃钢雕塑水晶玻璃钢花盆哪家好甘肃玻璃钢雕塑浮雕frp玻璃钢雕塑安阳玻璃钢动物雕塑定做厂家江西公园玻璃钢花盆热门玻璃钢红军雕塑定制人物雕塑玻璃钢玻璃钢人物浮雕雕塑安装服务四川校园雕塑玻璃钢香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化