您的位置:首页 > Web前端 > JavaScript

js number操作

2016-10-11 22:57 127 查看
使用IEEE754(二进制浮点数标准)来表示整数和浮点数。
js的表示数值范围,以及数值的极值;
document.write(Number.MIN_VALUE);//5e-324
document.write(Number.MAX_VALUE);//1.7976931348623157e+308
document.write(Number.NEGATIVE_INFINITY);//-Infinity
document.write(Number.POSITIVE_INFINITY);//Infinity

五种声明数值变量的方式:(查看来源:JS中不为人知的五种声明Number的方式简要概述

//方式一:最常见的方式,通过数字字面量方式声明
var num = 123;
//方式二:偶尔使用方式,大部分情况下是将字符串转成数字
var num = Number(123);
//方式三:很少使用,各神书,包括犀牛书,都将其列入不推荐方式
var num = new Number(123);
//方式四:神方式,目前还没见过人使用
var num = new Object(123);
//方式五:更离奇,更诡异
var num = Object(123); <strong>
</strong>
八进制时(十六进制也一样),字面值中的数值超过范围,前导部分的0被忽略,被视为十进制数;

计算时,八进制和十六进制终会转成十进制;

//0开头的是八进制,数字序列为0~7;
var num1 = 070;
document.write(num1);//56;八进制转为十进制
var num2 = 079;
document.write(num2);//无效的八进制数字--解析为79
var num3 = 08;
document.write(num3);//无效的八进制数字--解析为8
var num4 = 0xA;
document.write(num4);//10;十六进制转十进制
var num5 = 0x1f;
document.write(num5);//31;十六进制转十进制
var num6 = 0xg;
document.write(num6);//报错(没法转数值):Uncaught SyntaxError: Invalid or unexpected token

浮点数必须包含小数点,且小数点后必须有一位小数

var floatNum1 = 1.1;
document.write(floatNum1);//1.1;
document.write(typeof floatNum1);//number
var floatNum2 = 1.0;
document.write(floatNum2);//1;1.0自动变成了1
var floatNum3 = 0.1;
document.write(floatNum3);//0.1
var floatNum4 = .1;
document.write(parseInt(floatNum4));//0
document.write(floatNum4);//0.1;自动变成了0.1,.1的写法虽然有效,但不推荐
document.write(parseInt('.1'));//NaN;不推荐使用.1的反面例子

浮点数需要的内存空间是保存整数值的两倍,ECMAScript将不失时机地将浮点数转为整数(如:8.0转为8;8.01这种就没法转了)

浮点数计算的舍入误差问题,这是基于IEEE754数值的浮点计算通病;0.1 + 0.2 == 0.3肯定是个伪命题;

数值转换:

Number()

字符串去除前后空格,字符串为空,返回0;不能转为数值,返回NaN;

Boolean类型,true返回1,false返回0;

null返回0;

undefined返回NaN;

如果是数值只是简单的传入返回;整数值的前导0可去除,小数的前导0转数值会报错;

数值型字符串可以转为数值;前导0可去除;

非数值型字符串,返回NaN;

如果是对象,则调用对象的valueOf()方法,然后再次依照前面的规则转换返回的值。如果转换的结果为NaN,则调用对象的toString()方法,然后在依照前面的规则转换返回的字符串值。(这句话搞不懂js高级程序设计第3章Number类型 数值转换)

document.write(Number(true));//1
document.write(Number(undefined));//NaN
document.write(Number(null));//0
document.write(Number(03));//3
document.write(Number(1.3));//1.3
document.write(Number("3"));//3
document.write(Number("03"));//3
document.write(Number("1.3"));//1.3
document.write(Number("01.3"));//1.3
document.write(Number("3abc"));//NaN
var obj = new Object();
document.write(Number(obj));//NaN
八进制字符串直接去掉前导的0;十六进制字符串能直接转为十进制的值;

八进制和十进制的值都可以换算成十进制的值返回;

十进制的数字值直接传入和返回;

var str1 = ' 123.54567 ';//头尾各有一个空格
document.write(str1.length);//11
var num = Number(str1);
document.write(num);//123.54567前后的空格被去掉了;
document.write(Number(undefined));//NaN
document.write(Number(null));//0
document.write(Number("Hello World!"));//NaN
document.write(Number(""));//0
document.write(Number("35"));//35
document.write(Number("035"));//35
document.write(Number("0x35"));//53
document.write(Number(035));//29
document.write(Number(0035));//29
document.write(Number(0x35));//53
document.write(Number(35));//35
document.write(Number(true));//1

parseInt(string, radix)返回字符串的整数部分;

Number转换字符串时比较复杂且比较不合理,因此处理整数的时候更常用parseInt();

radix可选。表示要解析的数值的基数(该数值被当做几进制数值)。该值介于 2 ~ 36 之间。将数值作为radix进行来解析成十进制的值;

如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。

如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。

parseInt()函数先去除字符串前后的空格,不仅可以解析纯数字字符串,也可以解析以数字开头的部分数字字符串(非数字部分字符串在转换过程中会被去除)。

值得注意的是,当parseInt()函数所解析的是浮点数字符串时,取整操作所使用的方法为“向下取整”(truncate)。

非数值型字符串返回NaN;

第一个非数值字符前有数值字符的,截取前面的数值部分;

document.write(parseInt('abc'));//NaN
var str1 = ' 123.54567 ';//头尾各有一个空格
document.write(parseInt(str1));//123
document.write(parseInt(str1).toString().length);//3
document.write(parseInt('123.54567a'));//123
document.write(parseInt('123ab'));//123
document.write(parseInt(.1));//0
document.write(parseInt('.1'));//NaN;.1无法解析为数值;
parseInt()将数值视为N(第二个参数)进制,最后转换为十进制的值

像八进制和十六进制,第二个参数明确指定数值为多少进制,数值前的前导0和0x可以省略。

//将数值视为N(第二个参数)进制,转为十进制
document.write(parseInt(111));//111
document.write(parseInt(111,2));//7
document.write(parseInt(111,8));//73
document.write(parseInt(111,10));//111
document.write(parseInt(111,16));//273
document.write(parseInt('111'));//111
document.write(parseInt('111',2));//7
document.write(parseInt('111',8));//73
document.write(parseInt('111',10));//111
document.write(parseInt('111',16));//273
//不知道这些有前导0的数值是怎么转的,结果不知道怎么算出来的。
document.write(parseInt(0111));//73
document.write(parseInt(0111,2));//NaN;
document.write(parseInt(0111,8));//59
document.write(parseInt(0111,10));//73
document.write(parseInt(0111,16));//115

//将数值视为N(第二个参数)进制,转为十进制
document.write(parseInt('0111'));//111
document.write(parseInt('0111',2));//7
document.write(parseInt('0111',8));//73
document.write(parseInt('0111',10));///111
document.write(parseInt('0111',16));//273
//0x就是16进制
document.write(parseInt(0x111));//273
document.write(parseInt(0x111,2));//NaN(0x原本就是十六进制,八进制和十进制无法直接表示十六进制)
document.write(parseInt(0x111,17));//700
document.write(parseInt('0x111'));//273
document.write(parseInt('0x111',2));//0(二进制、八进制、十进制返回0)

4.parseFloat()

去除字符串头尾空格后,将字符串转成浮点数,没有小数位就直接取整数部分;

var str1 = ' 123.54567 ';//头尾各有一个空格
document.write(parseFloat(str1));//123.54567
document.write(parseFloat(str1).toString().length);//9

var str2 = '123.54567a';
document.write(parseFloat(str2));//123.54567

var str3 = '123ab';
document.write(parseFloat(str3));//123
document.write(parseFloat('.1'));//0.1

number转string:

1.数值转字符串最简单的方式:

var num1 = 123.4567;
document.write(typeof(num1));//number
document.write(typeof(num1 + ""));//string;此处用''和""都一样

2.NumberObject.toString(radix)

radix可选。规定表示数字的基数,使 2 ~ 36 之间的整数。若省略该参数,则使用基数 10。

当调用该方法的对象不是 Number时返回其本身

var num = 10;
var str = "abc";
document.write(num.toString());//"10"(默认转为十进制)
document.write(num.toString(2));//"1010"
document.write(num.toString(8));//"12"
document.write(num.toString(16));//"a"
document.write("10".toString(2));//字符串用toString()内容不变
document.write(str.toString(2));//字符串用toString()内容不变
var booleanstr = false;
document.write(booleanstr.toString(37));//Boolean类型的值用toString()内容不变
document.write(num.toString(37));//报错:toString() radix argument must be between 2 and 36

3.NumberObject.toFixed(num)

返回 NumberObject 的字符串表示,不采用指数计数法,小数点后有固定的 num 位数字。

num必需。规定小数的位数,是 0 ~ 20 之间的值,包括 0 和 20,有些实现可以支持更大的数值范围。如果省略了该参数,将用 0 代替。

如果必要,该数字会被四舍五入,也可以用 0 补足,以便它达到指定的长度。

如果 num 大于 le+21,则该方法只调用 NumberObject.toString
bff9
(),返回采用指数计数法表示的字符串。

当 num 太小或太大时抛出异常 RangeError。0 ~ 20 之间的值不会引发该异常。有些实现支持更大范围或更小范围内的值。

当调用该方法的对象不是 Number 时抛出 TypeError 异常。

4.NumberObject.toExponential(num)

num必需。规定指数计数法中的小数位数,是 0 ~ 20 之间的值,包括 0 和 20,有些实现可以支持更大的数值范围。如果省略了该参数,将使用尽可能多的数字。

返回 NumberObject 的字符串表示,采用指数计数法,即小数点之前有一位数字,小数点之后有 num 位数字。该数字的小数部分将被舍入,必要时用 0 补足,以便它达到指定的长度。

当 num 太小或太大时抛出异常 RangeError。0 ~ 20 之间的值不会引发该异常。有些实现支持更大范围或更小范围内的值。

当调用该方法的对象不是 Number 时抛出 TypeError 异常。

5.NumberObject.toPrecision(num)

返回 NumberObject 的字符串表示,包含 num 个有效数字。必要时,该数字会被舍入或用 0 补足。

num必需。规定必须被转换为指数计数法的最小位数。

该参数是 1 ~ 21 之间(且包括 1 和 21)的值,当 num 太小或太大时抛出异常 RangeError。有效实现允许有选择地支持更大或更小的 num。

如果省略了该参数,则调用方法 toString(),而不是把数字转换成十进制的值。

如果 num 足够大,能够包括 NumberObject 整数部分的所有数字,那么返回的字符串将采用定点计数法。否则,采用指数计数法,即小数点前有一位数字,小数点后有 num-1 位数字。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  js number