位置: 编程技术 - 正文

js为什么不能正确处理小数运算?(js为什么不能用var定义变量)

编辑:rootadmin

推荐整理分享js为什么不能正确处理小数运算?(js为什么不能用var定义变量),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:js为什么不支持多继承,js为什么运行不了,js为什么放在后面,js为什么不能用var定义变量,js为什么不能直接import,js为什么运行不了,为什么js不用编译,js为什么不能用var定义变量,内容如对您有帮助,希望把文章链接给更多的朋友!

上面的程序会输出1吗?

在 你有必要知道的 个 JavaScript 面试题 一文中,第 8 个题浅显的说了下 js 为什么不能正确处理小数运算的问题。今天重拾旧题,更深层次的剖析下这个问题。

但要先说明的是,不能正确处理小数的运算并不是 JavaScript 语言本身的设计错误,其它高级编程语言,如C,Java等,也是不能正确处理小数运算的:

数在计算机内部的表示

我们都知道,用高级编程语言编写的程序需要经过解释、编译等操作转变成 CPU(Central Processing Unit) 可以识别的机器语言才能运行,而对 CPU 来说,它不识别数的十进制、八进制和十六进制等,我们在程序中声明的这些进制数都会被转成二进制数进行运算。

为什么不是转换成三进制数进行运算呢?

计算机内部是由很多的 IC (Integrated Circuit: 集成电路) 这种电子部件构成的,它的长相大概是这样子:

IC 有很多种形状,在其两侧或内部并排排列着很多引脚(图示只画出了一侧)。IC 的所有引脚,只有直流电压 0V 或 5V 两个状态,即一个 IC 引脚只能表示两个状态。IC 的这个特性就决定了计算机内部的数据只能用二进制数处理。

js为什么不能正确处理小数运算?(js为什么不能用var定义变量)

由于1 位(一个引脚)只能表示两个状态,所以二进制的计算方式就变成了 0、1、、、….这种形式:

所以,在数的运算中,所有操作数都会被转成二进制数参与运算,如,会被转换成二进制

小数的二进制表示

如前文所说,程序中的数据都会被转换成二进制数,小数参与运算时,也会被转成二进制,如十进制的. 会被转换成.。

小数点后 4 位用二进制数表示的数值范围是 0.~0.,因此,这只能表示 0.5、0.、0.、0. 这四个十进制数以及小数点后面的位权组合(相加)而成的小数:

从上表可以看出,十进制数 0 的下一位是 0.,所以,0~0. 之间的小数,就无法用小数点后 4 位数的二进制数表示;如果增加二进制数小数点后面的位数,与其相对应的十进制数的个数也会增加,但无论增加多少位,都无法得到 0.1 这个结果。实际上,0.1 转换成二进制是 0.…… 注意 是无限重复的:

js 的 Number 类型并没有像 C / Java 等分整型、单精度、双精度等,而是统一表现为双精度浮点型。按照 IEEE 的规定,单精度浮点数用 位表示全体小数,而双精度浮点数用 位表示全体小数,而浮点数由符号、尾数、指数和基数组成,所以并不是所有的位数都用来表示小数,符号、指数等也要占据位数,基数不占据位数:

双精度浮点数的小数部分最多支持 位,所以两者相加之后得到这么一串 0.…因浮点数小数位的限制而截断的二进制数字,这时候,再把它转换为十进制,就成了 0.。

总结

js 不能正确处理小数运算,包括其它高级编程语言一样,这不是语言本身的设计错误,而是计算机内部本身就不能正确处理小数的运算,对小数的运算往往会得到意想不到的结果,因为并不是所有的十进制小数能被二进制表示。

标签: js为什么不能用var定义变量

本文链接地址:https://www.jiuchutong.com/biancheng/385587.html 转载请保留说明!

上一篇:javascript从作用域链谈闭包(javascript的作用域)

下一篇:js+css简单实现网页换肤效果(利用html css javascript做一个网页)

  • 车船税征税范围口诀
  • 补缴以前年度增值税以及滞纳金
  • 筹建期间业务招待费的财税处理规定
  • 发票超过三个月不能开
  • 小规模企业增值税减免政策
  • 基本户如果没有资金往来
  • 企业年末要写财务报告吗
  • 会计账簿账目核对要求包括哪些
  • 实习生应该如何计算个人所得税
  • 房租怎么抵扣个税计算方法
  • 赡养老人专项附加扣除可以是爷爷奶奶吗
  • 应收代位追偿款有没有明细科目
  • 销售退回的会计分录金额怎么写
  • 进项发票失控账务处理
  • 企业购买预付卡怎么做账
  • 银行负债类账户包括哪些
  • 增值税专用发票可以开电子发票吗
  • 机械租赁费发票图片
  • 医院食堂承包方案的实施细则
  • 营业资金账簿印花税减半
  • 房地产营改增后开票
  • 发票二维码压线可以用吗
  • 商品税目是什么意思4001
  • 资产减值损失和信用减值损失的区别
  • 收到股东交的多余的股金怎么做账务处理
  • 什么叫管理口径报表
  • 工商年报需要什么数据
  • 使用ps能完成的操作有哪些
  • 怎么批量给指定条件加入批注
  • Win10 64位正式版系统安装方法全过程图解(U大师)
  • win7怎么输入命令
  • 玩游戏网络延时高怎么处理
  • 民非提供服务收到的现金怎么算
  • 应交增值税的结转
  • 为什么我的win10
  • 股派发红利是涨还是跌
  • git可以管理二进制文件吗
  • 接受捐赠旧的固定资产以什么价格入帐
  • vue路由使用方法
  • 视觉机械臂操作视频
  • 集团对子公司拨款的规定
  • 房地产销售未完工产品转完工产品确认的销售收入
  • php实现上传图片功能
  • 上个月没有开票需要清卡吗
  • 销售产品收到现金的会计分录
  • js读取json配置文件
  • access数据库如何
  • PostgreSQL教程(十九):SQL语言函数
  • 个人所得税申报教程
  • sqlserver数据库事务
  • 应付账款账务处理中的错弊
  • 凭证字号和凭证编号一样吗
  • 企业所得税征税范围是
  • 员工多交个税企业就少交所得税吗?
  • 不开票销售收入怎么做账务处理
  • 公司临时工的车可以买吗
  • 出售金融商品的增值税计税依据
  • 基金申购费的会计分录
  • 进账单,其中有两个账户
  • 个体户要怎么注册公司
  • 前一年的未分配利润计算
  • mysql如何解压
  • 所有符合条件x+5的绝对值加x- 2的绝对值等于七的数x
  • windows mysql5.5升级5.7
  • oracle分区大小建议
  • windows7自动开机脚本文件
  • 新手怎么装
  • msoia.exe是什么程序
  • win7桌面小工具如何设置使用
  • win8怎么连接宽带账号密码
  • div css table
  • unicode 字符百科
  • jquery示例
  • jQuery用FormData实现文件上传的方法
  • angular.js
  • 深入理解两个大计重要论断心得体会
  • 如何做好设计师
  • unity协程的工作原理
  • dom 和bom
  • 北京朝阳地税局电话号码
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设