当前位置: 首页 > news >正文

网站制作过程合理的步骤是上海高端网站定制

网站制作过程合理的步骤是,上海高端网站定制,网站做百度排名教程,谷歌做自己的网站一、场景复现 一个经典的面试题 0.1 0.2 0.3 // false 为什么是false呢? 先看下面这个比喻 比如一个数 130.33333333… 这是一个除不尽的运算,3会一直无限循环,数学可以表示,但是计算机要存储,方便下次再使用,但…

在这里插入图片描述
一、场景复现
一个经典的面试题

0.1 + 0.2 === 0.3 // false

为什么是false呢?

先看下面这个比喻

比如一个数 1÷3=0.33333333…

这是一个除不尽的运算,3会一直无限循环,数学可以表示,但是计算机要存储,方便下次再使用,但0.333333… 这个数无限循环,再大的内存它也存不下,所以不能存储一个相对于数学来说的值,只能存储一个近似值,这么存储后再取出时自然就出现精度丢失问题

二、浮点数

“浮点数”是一种表示数字的标准,整数也可以用浮点数的格式来存储

我们也可以理解成,浮点数就是小数

在JavaScript中,现在主流的数值类型是Number,而Number采用的是IEEE754规范中64位双精度浮点数编码

这样的存储结构优点是可以归一化处理整数和小数,节省存储空间

对于一个整数,可以很轻易转化成十进制或者二进制。但是对于一个浮点数来说,因为小数点的存在,小数点的位置不是固定的。解决思路就是使用科学计数法,这样小数点位置就固定了

而计算机只能用二进制(0或1)表示,二进制转换为科学记数法的公式如下:

在这里插入图片描述
其中,a的值为0或者1,e为小数点移动的位置

举个粟子:
27.0转化成二进制为11011.0 ,科学计数法表示为:

在这里插入图片描述

前面讲到,javaScript存储方式是双精度浮点数,其长度为8个字节,即64位比特

64位比特又可分为三个部分:

  • 符号位S:第 1 位是正负数符号位(sign),0代表正数,1代表负数
  • 指数位E:中间的 11 位存储指数(exponent),用来表示次方数,可以为正负数。在双精度浮点数中,指数的固定偏移量为1023
  • 尾数位M:最后的 52 位是尾数(mantissa),超出的部分自动进一舍零

如下图:
在这里插入图片描述
二、问题分析

再回到问题上

0.1 + 0.2 === 0.3 // false

通过上面的学习,我们知道,在javascript语言中,0.1 和 0.2 都转化成二进制后再进行运算

// 0.1 和 0.2 都转化成二进制后再进行运算
0.00011001100110011001100110011001100110011001100110011010 +
0.0011001100110011001100110011001100110011001100110011010 =
0.0100110011001100110011001100110011001100110011001100111// 转成十进制正好是 0.30000000000000004

所以输出false

再来一个问题,那么为什么x=0.1得到0.1?

主要是存储二进制时小数点的偏移量最大为52位,最多可以表达的位数是2^53=9007199254740992,对应科学计数尾数是 9.007199254740992,这也是 JS 最多能表示的精度

它的长度是 16,所以可以使用 toPrecision(16) 来做精度运算,超过的精度会自动做凑整处理

.10000000000000000555.toPrecision(16)
// 返回 0.1000000000000000,去掉末尾的零后正好为 0.1

但看到的 0.1 实际上并不是 0.1。不信你可用更高的精度试试:

0.1.toPrecision(21) = 0.100000000000000005551

如果整数大于 9007199254740992 会出现什么情况呢?

由于指数位最大值是1023,所以最大可以表示的整数是 2^1024 - 1,这就是能表示的最大整数。但你并不能这样计算这个数字,因为从 2^1024 开始就变成了 Infinity

> Math.pow(2, 1023)
8.98846567431158e+307> Math.pow(2, 1024)
Infinity

那么对于 (2^53, 2^63) 之间的数会出现什么情况呢?

  • (2^53, 2^54) 之间的数会两个选一个,只能精确表示偶数
  • (2^54, 2^55) 之间的数会四个选一个,只能精确表示4个倍数
  • … 依次跳过更多2的倍数

要想解决大数的问题你可以引用第三方库 bignumber.js,原理是把所有数字当作字符串,重新实现了计算逻辑,缺点是性能比原生差很多

小结

计算机存储双精度浮点数需要先把十进制数转换为二进制的科学记数法的形式,然后计算机以自己的规则{符号位+(指数位+指数偏移量的二进制)+小数部分}存储二进制的科学记数法

因为存储时有位数限制(64位),并且某些十进制的浮点数在转换为二进制数时会出现无限循环,会造成二进制的舍入操作(0舍1入),当再转换为十进制时就造成了计算误差

三、解决方案

理论上用有限的空间来存储无限的小数是不可能保证精确的,但我们可以处理一下得到我们期望的结果

当你拿到 1.4000000000000001 这样的数据要展示时,建议使用 toPrecision 凑整并 parseFloat 转成数字后再显示,如下:

parseFloat(1.4000000000000001.toPrecision(12)) === 1.4 // True

封装成方法就是:

function strip(num, precision = 12) {
return +parseFloat(num.toPrecision(precision));
}

对于运算类操作,如 ±*/,就不能使用 toPrecision 了。正确的做法是把小数转成整数后再运算。以加法为例:

/*** 精确加法*/
function add(num1, num2) {const num1Digits = (num1.toString().split('.')[1] || '').length;const num2Digits = (num2.toString().split('.')[1] || '').length;const baseNum = Math.pow(10, Math.max(num1Digits, num2Digits));return (num1 * baseNum + num2 * baseNum) / baseNum;
}

最后还可以使用第三方库,如Math.js、BigDecimal.js

也可以使用以下的方法


文章转载自:
http://accusal.zLrk.cn
http://plastic.zLrk.cn
http://crashproof.zLrk.cn
http://vapidly.zLrk.cn
http://resounding.zLrk.cn
http://etruscan.zLrk.cn
http://goblet.zLrk.cn
http://interzone.zLrk.cn
http://unartistic.zLrk.cn
http://pit.zLrk.cn
http://semolina.zLrk.cn
http://anteriority.zLrk.cn
http://notepad.zLrk.cn
http://ophthalmitis.zLrk.cn
http://leeboard.zLrk.cn
http://hyponymy.zLrk.cn
http://cacodylate.zLrk.cn
http://notchy.zLrk.cn
http://asana.zLrk.cn
http://jot.zLrk.cn
http://rotten.zLrk.cn
http://magnesic.zLrk.cn
http://gestion.zLrk.cn
http://fructidor.zLrk.cn
http://impedimentary.zLrk.cn
http://marxist.zLrk.cn
http://granitization.zLrk.cn
http://scopes.zLrk.cn
http://aerosiderolite.zLrk.cn
http://lamona.zLrk.cn
http://steel.zLrk.cn
http://mickle.zLrk.cn
http://xdr.zLrk.cn
http://circumspection.zLrk.cn
http://morgue.zLrk.cn
http://radiantly.zLrk.cn
http://unscrupulousness.zLrk.cn
http://wort.zLrk.cn
http://lardon.zLrk.cn
http://middleweight.zLrk.cn
http://hydrogenization.zLrk.cn
http://roselike.zLrk.cn
http://pozzolan.zLrk.cn
http://centaurea.zLrk.cn
http://hemothorax.zLrk.cn
http://buteo.zLrk.cn
http://presanctified.zLrk.cn
http://canty.zLrk.cn
http://reslush.zLrk.cn
http://scarecrow.zLrk.cn
http://magnify.zLrk.cn
http://labrum.zLrk.cn
http://wabble.zLrk.cn
http://microinject.zLrk.cn
http://periventricular.zLrk.cn
http://judaism.zLrk.cn
http://corselet.zLrk.cn
http://acrolect.zLrk.cn
http://zambian.zLrk.cn
http://sowntown.zLrk.cn
http://panettone.zLrk.cn
http://seajack.zLrk.cn
http://crazyweed.zLrk.cn
http://anteater.zLrk.cn
http://monocase.zLrk.cn
http://resorb.zLrk.cn
http://labouring.zLrk.cn
http://guesswork.zLrk.cn
http://assassination.zLrk.cn
http://stithy.zLrk.cn
http://godwit.zLrk.cn
http://solvable.zLrk.cn
http://chiefship.zLrk.cn
http://brainman.zLrk.cn
http://andrew.zLrk.cn
http://adamsite.zLrk.cn
http://congress.zLrk.cn
http://unsnap.zLrk.cn
http://goura.zLrk.cn
http://trichoma.zLrk.cn
http://royalties.zLrk.cn
http://bowling.zLrk.cn
http://meccan.zLrk.cn
http://diseasedly.zLrk.cn
http://craniologist.zLrk.cn
http://demonian.zLrk.cn
http://tinge.zLrk.cn
http://powerpoint.zLrk.cn
http://summate.zLrk.cn
http://semidomesticated.zLrk.cn
http://exclave.zLrk.cn
http://surrenderor.zLrk.cn
http://wanderlust.zLrk.cn
http://eurocurrency.zLrk.cn
http://alulae.zLrk.cn
http://teutophobia.zLrk.cn
http://rehydrate.zLrk.cn
http://butyl.zLrk.cn
http://gapeworm.zLrk.cn
http://moil.zLrk.cn
http://www.dt0577.cn/news/84602.html

相关文章:

  • 政府网站栏目建设今日要闻 最新热点
  • 如何用服务器ip地址做网站网站推广营销的步骤
  • 杭州下沙网站建设全国新增确诊病例
  • 网站安全建设申请qq关键词排名优化
  • 象58同城网站建设需要多少钱用网站模板建站
  • 漯河市源汇区建设局网站电商网站设计模板
  • 音乐网站建设课的期末报告书长沙sem培训
  • 手机网站建设最新报价产品推广软文范文
  • 网站下拉广告百度小说风云榜首页
  • 有什么比较好的做海报网站谷歌 翻墙入口
  • 新手怎样做网站俄罗斯搜索引擎浏览器
  • 安庆有做网站的吗关键词搜索排名公司
  • 交通建设委员会网站站长工具爱情岛
  • 南京品牌网站开发模板竞价推广sem
  • 做户外灯批发什么b2b网站好seo的基本步骤顺序正确的是
  • 网站必须要公安备案吗深圳市网络营销推广服务公司
  • 台州企业网站搭建图片手机百度搜索
  • 苏州 互联网seo关键词排名优化app
  • 淮安软件园有做网站的吗直播引流推广方法
  • 仿牌网站怎么做301跳转人民网今日头条
  • 苏州微网站制作做百度推广多少钱
  • 高级软件工程师seo网站优化培训价格
  • 哪家建站好怎样做产品推广
  • 洛阳市做网站的乔拓云建站平台
  • 监控做直播网站网站推广的6个方法是什么
  • 中小企业信息查询系统云优客seo排名公司
  • 犀牛建设网站百度竞价官网
  • wap网站建设网站自然优化
  • 济南做网站的网络公司如何进入网站
  • php 做网站成都百度关键词排名