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

上海手机响应式网站建设设计黄冈建设局网站首页

上海手机响应式网站建设设计,黄冈建设局网站首页,域名比价网,wordpress 使用新id一、场景复现 一个经典的面试题 0.1 0.2 0.3 // false 为什么是false呢? 先看下面这个比喻 比如一个数 130.33333333… 这是一个除不尽的运算#xff0c;3会一直无限循环#xff0c;数学可以表示#xff0c;但是计算机要存储#xff0c;方便下次再使用#xff0c;但… 一、场景复现 一个经典的面试题 0.1 0.2 0.3 // false 为什么是false呢? 先看下面这个比喻 比如一个数 1÷30.33333333… 这是一个除不尽的运算3会一直无限循环数学可以表示但是计算机要存储方便下次再使用但0.333333… 这个数无限循环再大的内存它也存不下所以不能存储一个相对于数学来说的值只能存储一个近似值这么存储后再取出时自然就出现精度丢失问题 二、浮点数 “浮点数”是一种表示数字的标准整数也可以用浮点数的格式来存储 我们也可以理解成浮点数就是小数 在JavaScript中现在主流的数值类型是Number而Number采用的是IEEE754规范中64位双精度浮点数编码 这样的存储结构优点是可以归一化处理整数和小数节省存储空间 对于一个整数可以很轻易转化成十进制或者二进制。但是对于一个浮点数来说因为小数点的存在小数点的位置不是固定的。解决思路就是使用科学计数法这样小数点位置就固定了 而计算机只能用二进制0或1表示二进制转换为科学记数法的公式如下 其中a的值为0或者1e为小数点移动的位置 举个粟子 27.0转化成二进制为11011.0 科学计数法表示为 前面讲到javaScript存储方式是双精度浮点数其长度为8个字节即64位比特 64位比特又可分为三个部分 符号位S第 1 位是正负数符号位sign0代表正数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 再来一个问题那么为什么x0.1得到0.1 主要是存储二进制时小数点的偏移量最大为52位最多可以表达的位数是2^539007199254740992对应科学计数尾数是 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.98846567431158e307 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://www.hkea.cn/news/14582535/

相关文章:

  • 中国制造网官网入口国外注册网站做百度seo
  • 河南省住房建设厅官方网站青岛发现51例阳性
  • 黑龙江建设网查ca证书wordpress速度优化插件
  • 各大城市网站哪里做做网批有专门的网站吗
  • 网站建设运营维护方案电商系统哪家好排行榜
  • 商洛市商南县城乡建设局网站网站开发人员的岗位有
  • 企业网站推广工具东营住房和城乡建设信息网
  • 网站被**泛解析后的解决方法建设门户网站系统的必要性
  • 新开的网站怎么做seo优化简单网页制作模板免费
  • 域名怎么绑定自己网站共享ip服务器做网站
  • 深圳市门户网站建设多少钱网站建设 客户需求
  • 建设银行投诉处理网站现在有什么有效的引流方法
  • 网站节约化建设锁定网站导航栏
  • 文本网站代码空两格怎么做远大科技 网站建设
  • 网站开发流程的认识网络平台代理合同
  • 企业网站推广的方式有哪些com域名续费一年要多少钱
  • 可信赖的做网站百度云资源搜索平台
  • 江苏分销网站建设建筑施工企业有哪些
  • 玉树商城网站建设wordpress怎么做网盘站
  • 网站栏目管理建设档案网站建设外包公司
  • 网站扁平结构六安网红水坝
  • 沈阳网站制作 房小二网网件路由器无法登录
  • 淘宝联盟手机网站建设互联网电商
  • 散热器 东莞网站建设linux 搭建wordpress
  • 平板电脑网站模板小程序制作教程零基础入门
  • 天津百度网站快速排名重庆招考网
  • 朋友圈网站文章怎么做济南集团网站建设报价
  • 企业做门户网站的重要性wordpress主题php详解
  • 淘宝客合伙人网站建设网站挂马黑链检测清除工具
  • 免费网站空间论坛牛商网招聘