前言:
如今大家对“js判断有小数点和无小数”大概比较关注,我们都想要剖析一些“js判断有小数点和无小数”的相关知识。那么小编同时在网上搜集了一些有关“js判断有小数点和无小数””的相关资讯,希望同学们能喜欢,各位老铁们快快来了解一下吧!在这周网络授课讲解变量与常量案例章节中,在计算0.1+0.2时,出现的结果与预期不符合,对此问题很多学生较为纠结。为解决这个问题,本节课主要讲授JavaScript数值型数据存储格式及浮点型数据的加运算操作,以解决各位同学的困惑。
问题引入?
例题:请编写JS程序计算0.1+0.2,并通过控制台输出计算结果。
该程序直观判断可知计算结果为0.3,但是通过控制台输出显示的结果却不是0.3,其计算结果为:0.30000000000000004。这一问题也是在浮点类型数据相加操作中代表性问题之一。产生这一问题的原因在于浮点类型数据的存储与运算规则、过程。以下对问题进行解释说明。
JavaScript数值存储
JavaScript程序设计语言存储数值型数据与其他程序设计语言相比较,没有单独对整数、小数进行精确划分,在实际存储过程中将所有数值按照IEEE754标准使用64位浮点数存储数值。64位浮点类型也称为双精度浮点类型,占用8个字节,共64位。存储结构如下图所示:
在该结构中,64位共分为三组,最高位为符号位用于表示数值的正负,即上图蓝色部分,绿色部分11位用于存储指数值(浮点类型表示类似于科学计数法),剩余52位用于存储小数位即有效数字。例如:0.1 的64位浮点表示值为:
001111111011100110011001100110011001100110011001100110011001101010进制小数转换为64位浮点类型
本例所提出的问题需要计算0.1与0.2的和,针对JavaScript脚本语言首先需要将其转换为64位浮点类型。浮点类型数据的表现形式及说明如下:
其中s符号位占1位,指数E占11位,有效数字占52位。其M值可通过左移右移实现在1~2范围之内。如计算M值为101*2^2可表示为1.01*2^4。对于各部分IEEE754给出了明确的定义,其定义描述如下:
在执行过程中首先需要将十进制小数转换为2进制表示形式,针对题目操作数0.1余0.2,他们对应二进制表示形式如下:
0.2十进制:0.00110011(下划线部分表示无限循环)0.1十进制: 0.000110011(下划线部分表示无限循环)
两位小数的二进制表示描述如上,如实际存储过程中需要指定长度的话直接用循环部分填充即可。以计算出的二进制为基础可以求出对应的s、M、E分别为多少,其中10进制的0.2求解结果如下:
以上为基础我们可以求出两位操作数的64位存储相关参数。求解结果描述如下图所示:
浮点类型数据的加法操作
64位浮点类型数据在进行加法运算时需要按照其运算规则执行运算,其运算规则描述如下:
1.对阶
主要是指将两个操作数的指数部分调整为一样,本例题指数部分分别为-3,-4,按照对阶要求向大的靠拢,需要将-4指数调整为-3。在对阶过程需要对M部分作出对应调整。调整结果描述如下:
经过对阶处理之后所有的指数都变为01111111100。因此我们可以进一步对M部分进行加法操作。
2.M尾数运算
尾数运算部分主要按照二进制数值进行求和运算即可。在计算过程中可能因为进位关系导致数据整体长度发生变化即产生溢出。本例尾数部分运算过程与结果描述如下:
3.规格化处理(右规)
本例运算过程由于加运算产生进位而导致溢出,最终计算结果形式为10.x x x … x。这种形式需要通过对其右规实现规格化处理。尾数每右移一位,阶码相应加 1,最高位补0。
4.舍入处理
在规格化过程中随着右移操作,最右侧位将会被丢掉,因此需要通过舍入处理减少因丢弃导致的精度损失。本例题采用就近舍入方法,最后舍弃位为1,舍弃之后在剩余结果最低位加1,因此最后四位变为0100。操作结果描述如下:
综上所述,本例题最终0.1加0.2的计算结果二进制表示为:
01.0011001100110011001100110011001100110011001100110100*2^-2问题解决
在获取二进制计算结果之后,为方便观察,我们将该二进制数据恢复为10进制数据,然后进行结果判断,首先去掉指数部分结果如下:
0.010011001100110011001100110011001100110011001100110100转换结果为:0.30000000000000004441
如上所示,通过实际手工计算浮点型数据加运算,我们可以清楚了解在JavaScript进行0.1与0.2加运算时出现0.30000000000000004的原因了。如有问题不清楚同学可在评论区留言评论,如发现错误也可留言,大家共同探讨、学习、提高。
本头条号长期关注编程资讯分享;编程课程、素材、代码分享及编程培训。如果您对以上方面有兴趣或代码错误、建议与意见,可以联系作者,共同探讨。更多程序设计相关教程及实例分享,期待大家关注与阅读!系列教程链接如下:
JavaScript基础教程(二)变量、常量与运算符
JavaScript基础教程(一)课程说明
标签: #js判断有小数点和无小数