深⼊理解JavaScript中的浮点数
js只有⼀种数值型数据类型,不管是整数还是浮点数,js都把归为数字。
typeof 17;  // “number”
typeof 98.6; // “number”
typeof –2.1; // “number”
js中的所有数字都是双精度浮点数。是由IEEE754标准制定的64位编码数字(这个是什么东东,不知道,回头查⼀下吧)
那么js是如何表达整数的,双精度浮点数可以完美地表⽰⾼达53位精度的整数(没有什么概念,没处理过多⼤的数据,没⽤完过!),从-9007199254740992(-253)到9007199254740992(253)的所有整数都是有效的双精度浮点数。
⼤多数算术运算符都可以使⽤整数、实数或两者的组合进⾏计算。
0.1*1.9    //0.19
-
99+100  //1
21-12.3  //8.7
2.5/5  //0.5
21%8  //5
算术运算符⽐较特殊,js不会直接将操作数作为浮点数进⾏计算,⽽是将其隐式转换为32位整数后进⾏运算。(确切的说,会被转换为32位⼤端(big-endian)的2的补码表⽰的整数(实话说这⾥真的不知道是什么意思,求科普))以按位或运算表达式为
例:
8|1; //9
运算过程
⾸先8和1是双精度的浮点数。但也可以表⽰为32位整数,即32位的⼆进制表⽰。
整数8表⽰为32位⼆进制为:
0000 0000 0000 0000 0000 0000 0000 1000
也可能过
(8).toString(2); //”1000”
toString的参数是转换基数
(下⾯是我试的以其它基数转换的,和本⽂⽆关)
(8).toString(8); //”10”
(8).toString(16); //”8”
整数1表⽰为32位⼆进制为:
0000 0000 0000 0000 0000 0000 0000 0001
运⾏按位或
0000 0000 0000 0000 0000 0000 0000 1000
0000 0000 0000 0000 0000 0000 0000 0001
--------------------------------------------
0000 0000 0000 0000 0000 0000 0000 1001
同样的使⽤标准库函数parseInt验证,同样以2作为基数,前导0不影响运算结果,不必要。
parseInt('1001',2) //9
(下⾯是我试的以其它基数转换的,和本⽂⽆关)
parseInt('1001',8) //513
parseInt('1001',16) //4097
总结算术运算的过程就是,将操作数转换为整数,然后使⽤整数位模式进⾏运算,最后将结果转换为标准的js浮点数。
浮点数的警⽰:出了名的不精确。⽐如
0.1+0.2; //0.30000000000000004
原因:尽管64位浮点数精度已经很⾼,但双精度浮点数也只能表⽰⼀组有限的数字,⽽不能表⽰所有的实数集。浮点运算只能产⽣近似的结果,四舍五⼊到最接近的可表⽰的实数。当你执⾏⼀系列的运算,随着舍⼊误差的积累,运算结果会越来越不精确。舍⼊也使算术运算定律产⽣⼀些偏差。例如结合律。对于任意实数
x,y,z总满⾜(x+y)+z=x+(y+z)
浮点数就不⼀定:
(0.1+0.2)+0.3; //0.6000000000000001
0.1+(0.2+0.3); //0.6
浮点数权衡了精度和性能,关⼼精度时,要⼩⼼浮点数的局限性。
解决办法就是把浮点运算转化为整数运算。
(10+20)+30; //60
10+(20+30); //60
然后再除少放⼤倍数。要注意整数范围要在-253~253内。
总结
1、js的数字都是双精度的浮点数
2、js的整数仅仅是双精度浮点数的⼀个⼦集,不是单独的⼀个类型
3、位运算将数字视为32位的有符号整数
浮点数的基数什么意思4、当⼼浮点运算的精度问题
以上这篇深⼊理解JavaScript中的浮点数就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。