我们在输入数字时,可以给数字加下划线 “_” 进行分隔,使数字更易读,我们称之为数字的“语法糖”
let billion = 1000000000;
和
let billion = 1_000_000_000;
其实是一样的,JavaScript 引擎会忽略数字之间的下划线。
我们还可以用 e 后面跟指定一个数字来表示有多少个零跟在后面,例如
let billion = 1e9; //和 let billion = 1000000000;是一样的
同样,对于小数我们也可以用同样的方法,如果不想写太多的零,可以像下面这样写
let mcs = 0.000001;
和
let mcs = 1e-6;
是一样的,e后面跟的数字表示 1 前面有多少个零,跟的数字用负数表示。
对于不同进制,我们可以选择加前缀来表示:
0x :表示十六进制
0b :表示二进制
0o: 表示八进制
例如
let a = 0b11111111; //表示二进制的255
let b = 0o377; //表示八进制的255
let c = 0xff; //表示十六进制的255
alert( a == b && a == c ); // true
他们虽然进制不同,但表示都是一个数字。
也只有上面的三种进制支持这种写法,如果我们要写其他的进制,我们就需要用到函数 parseInt 。
方法介绍
toString( base )
方法 num.toString( base ) 返回在给定的 base 进制数字系统中 num 的字符串表现形式。
例如:
let num = 255;
alert( num.toString( 16 ) ); // ff
alert( num.toString( 2 ) ); // 11111111
base 的范围可以从 2 到 36 .默认情况是 10;我们如果使用默认情况可以将一个数字转换成字符串形式输出。
注意:如果我们想要在一个数字上直接调用方法,需要在数字后面跟两个点在写方法,例如:
alert( 123456..toString(36) ); // 2n9c
舍入
Math.round()//将括号里的数字采用四舍五入形式取整(!!)
例如 Math.round( 3.5 ) == 4Math.ceil()//将括号里的小数采用向上取整(!!)
例如 Math.ceil( 3.3 ) == 4Math.floor()//将括号里面的小数采用向下取整(!!)
例如 Math.floor( 3.6) == 3Math.trunc()//移除小数点后的数,保留整数,IE 浏览器不支持
例如 Math.trunc( 3.6) == 3以下是总结他们差异的表格
toFixed() 函数
函数 toFixed() 将数字舍入到小数点后的 n 位,并以字符串形式返回结果,舍入方法类似于四舍五入法,但是对于中位值及以下数字会向下取值,例如 12.35 只保留一位会返回12.3,对于中位数以上会向上取整,例如 12.36 会返回 12.4 ,例:
let num = 12.34;
alert( num.toFixed( 1 ) ); // “12.3”
如果数字后面的位数不够 n ,那么该函数会在末尾添加 0 ,保证小数位数位 n 。
这个函数存在的意义是帮我我们解决 IEEE-754 所带来的浮点数不精确的问题,在计算机内部,数字是以64位格式 IEEE-754 表示的,所以它有52位用于储存数字,其中11位用于储存小数点,还有一位用于储存符号,如果一个数字太大,超过了64位存储,则可能会导致无穷大 Infinity 。
为什么0.2 + 0.1 不等于 0.3 ,是因为在十进制看起来很简单的,当分子为1时,十进制只要分母为10的整数次幂就可以正确的表示,二进制只要分母为2的整数次幂就可以正常工作,但是0.1作为1/10,十进制的10显然无法转化为正确的二进制分母表示,所以1/10对于二进制来说实际上是一个无限循环的数字,这就是我为什么0.1并不是真正的0.1的原因。
toFixed() 对小数的舍入并将数字转化成字符串,正好可以解决计算机无法精确储存 0.1 或者 0.2 的问题。
测试:isFinite 和 isNaN
还记得这两个特殊的数值吗:
Infinity 和 -Infinity 他们比任何数都大/都小
NaN 代表一个 Error。
它们都属于 number 类型,但不是普通“数字”,因此,我们有检查他们的特别函数:
isNaN( value ) 将其参数转化为数字,然后测试它是否为 NaN,返回 true 或者 false 。
因为 “NaN” 是独一无二的,他不等于任何东西,哪怕它自身。
isFinite() 将其参数转化为数字,如果是常规数字则返回 true ,而转化后为 NaN 、Infinity 和 -Infinity 则返回 false 。
object.is() 进行比较
有一个特殊的内建方法 object.is ,它类似于 === 一样对值进行比较,但他对于两种边缘情况更加可靠:
1.它适用于 NaN : alert( object.is( NaN, NaN ) ); //true
2.值 0 和 -0 是不同的:alert( object.is( 0, -0 ) ); //false
其他情况下 object.is( a, b ) 均与 a === b 相同。
parseInt 和 parseFloat
我们平时使用加号 + 或者 Number() 对数字转换是严格的。如果一个值不完全是一个数字,那么就会失败。唯一的例外是字符串开头和结尾的空格,他们会被忽略。
但在现实生活或者编程中,我们会需要提取一个有单位的值,例如CSS中的像素,或者日常生活中的货币,这就是 parseInt 和 parseFloat 的作用。他们可以从字符串中提取数字,直到无法读取为止,如果发生 error ,就返回已经提取到的数字。
parseInt() 返回一个整数
//当字符串开头不为正负符号、0、空格和数字时,会直接返回 NaN //当碰到第一个不为数字的字符后,发生error,包括不在开头的空格 //在开头和结尾的空格会被忽略,在开头的0也会被忽略 //有两个参数,第二个参数可以解析字符串中对应进制的数,parseFloat() 返回一个浮点数
//当字符串开头不为正负符号、0、空格和数字时,会直接返回 NaN //当碰到第一个不为数字的字符后(第一个小数点除外),发生error,包括不在开头的空格,碰到第二次出现的小数点也会发生error //在开头和结尾的空格和 0 会被忽略