手机版

js为什么不能正确处理十进制运算?

时间:2021-09-19 来源:互联网 编辑:宝哥软件园 浏览:

var sum=0;for(var I=0;i 10I){ sum=0.1;} console . log(sum);上面的程序会输出1吗?

在您需要了解的25个JavaScript面试问题的文章中,第八个问题简单讲述了为什么js不能正确处理十进制运算。今天我就拿起老话题,对这个问题进行更深层次的分析。

但首先需要注意的是,不能正确处理十进制运算的并不是JavaScript语言本身的设计错误,其他高级编程语言,比如C和Java,也不能正确处理十进制运算:

# include stdio . hvoid main(){ float sum;int I;sum=0;for(I=0;i 100I){ sum=0.1;} printf(“% f \ n”,sum);//10.000002}计算机中的数字表示。

众所周知,用高级编程语言编写的程序,需要经过解释、编译等,才能翻译成CPU(中央处理器)认可的机器语言。但对于CPU来说,它不识别十进制、八进制和十六进制数,程序中声明的所有二进制数都会转换成二进制数进行运算。

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

电脑内部是由ic(集成电路:)等很多电子元器件组成,其外观大概是这样的:

集成电路的形状很多,很多引脚并排排列在它的两侧或内部(图中只显示了一侧)。集成电路的所有引脚只有DC电压0V或5V两种状态,即一个集成电路引脚只能代表两种状态。ic的这一特性决定了计算机内部的数据只能用二进制数来处理。

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

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

十进制的二进制表示。

如前所述,程序中的数据会转换为二进制数,十进制数在参与运算时也会转换为二进制数,例如十进制11.1875会转换为1101.0010。

用二进制数表示的小数点后四位数字的数值范围为0.0000~0.1111,因此只能表示0.5、0.25、0.125、0.0625的十进制数以及小数点后各位数字组合(相加)形成的十进制数:

从上表可以看出,十进制数0的下一位是0.0625,所以0到0.0625之间的十进制数不能用小数点后有四位的二进制数来表示。如果增加二进制数小数点后的位数,二进制数对应的十进制数也会增加,但无论增加多少位数,都得不到0.1的结果。实际上,从0.1到二进制的转换是0.00110011001100110011.注意0011是无限重复的:

console . log(0.2 0.1);//操作数的二进制表示为0.1=0.0001 1001 1001 1001……(无限循环)0.2=0.0011 0011 0011……(无限循环)js的Number类型不像整数、单精度、双精度等。但统一表示为双精度浮点类型。按照IEEE规定,单精度浮点数用32位表示所有小数,而双精度浮点数用64位表示所有小数,浮点数由符号、尾数、指数和基数组成,所以不是所有的数字都用来表示小数、符号、指数等。也应该占用位数,而基数不占用位数:

双精度浮点数的小数部分最多可以支持52位,所以相加后得到0.0100110011001100110011001100110011001100…二进制数由于浮点数小数位数的限制而被截断。此时转换为十进制,变成0.3000000000000000000000004。

摘要

Js不能正确处理十进制运算,包括其他高级编程语言。这不是语言本身的设计错误,而是计算机本身无法正确处理十进制运算。十进制运算往往会得到意想不到的结果,因为不是所有的十进制小数都可以用二进制来表示。

以上就是本文的全部内容,希望对大家的学习有所帮助。

版权声明:js为什么不能正确处理十进制运算?是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。