JavaScript数值类型整理之数值类型运算

 2015年04月25日    424     声明



在JavsScript中,在存储时并不区分number和float类型,而是统一按float存储。而JavaScript使用IEEE754-2008标准定义的64bit浮点格式存储number,按照IEEE754的定义:decimal64对应的整形部分长度为10,小数部分长度为16,如最后一个小数为0,则取1作为有效数字标志。因此,如果数值中存在小数,小数部分会有16位。示例如下:


var i = 0.07;
console.log(i*100);		//7.000000000000001
console.log(1/3);		//0.3333333333333333
console.log(0.1+0.2);    	//0.30000000000000004
由上可见,这并不是我们的想要的结果。为了得到我们想要的的结果,需要对计算结果进行一些处理。处理时主要会用到JavaScript的Math对象,需要按一定精度保留小数位时,要使用Numer对象的toFixed()方法。


Math对象中的方法

方法 描述
abs(x) 返回数的绝对值。
acos(x) 返回数的反余弦值。
asin(x) 返回数的反正弦值。
atan(x) 以介于 -PI/2 与 PI/2 弧度之间的数值来返回 x 的反正切值。
atan2(y,x) 返回从 x 轴到点 (x,y) 的角度(介于 -PI/2 与 PI/2 弧度之间)。
ceil(x) 对数进行上舍入。
cos(x) 返回数的余弦。
exp(x) 返回 e 的指数。
floor(x) 对数进行下舍入。
log(x) 返回数的自然对数(底为e)。
max(x,y) 返回 x 和 y 中的最高值。
min(x,y) 返回 x 和 y 中的最低值。
pow(x,y) 返回 x 的 y 次幂。
random() 返回 0 ~ 1 之间的随机数。
round(x) 把数四舍五入为最接近的整数。
sin(x) 返回数的正弦。
sqrt(x) 返回数的平方根。
tan(x) 返回角的正切。
toSource() 返回该对象的源代码。
valueOf() 返回 Math 对象的原始值。


toFixed() 方法

toFixed()方法可把 Number 四舍五入为指定小数位数的数字。语法格式如下:

NumberObject.toFixed(num)

num,为必需参数,规定被转换数的小数位数,取值范围为 0 ~ 20 之间的值,包括 0 和 20,如果省略了该参数,将用 0 代替。长度小于被转换数的小数位时,值会被四舍五入,小于小数位时,将用0补足。


浮点数加、减、乘、除解决方案

加法

fuction addition(arg1,arg2){  
    var r1,r2,m;  
    try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}  
    try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}  
    m=Math.pow(10,Math.max(r1,r2));  
    return (arg1*m+arg2*m)/m;  
} 


减法

fuction subtraction(arg1,arg2) {
    var r1,r2,m,n;  
    try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
    try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}  
    m=Math.pow(10,Math.max(r1,r2));  
    //精度长度  
    n=(r1>=r2)?r1:r2;  
    return ((arg1*m-arg2*m)/m).toFixed(n);  
}


乘法

function multiply(arg1,arg2) {   
    arg1=String(arg1);var i=arg1.length-arg1.indexOf(".")-1;i=(i>=arg1.length)?0:i;   
    arg2=String(arg2);var j=arg2.length-arg2.indexOf(".")-1;j=(j>=arg2.length)?0:j;   
    return arg1.replace(".","")*arg2.replace(".","")/Math.pow(10,i+j);   
} 


除法

function division(arg1,arg2){   
    var t1=0,t2=0,r1,r2;   
    try{t1=arg1.toString().split(".")[1].length}catch(e){}   
    try{t2=arg2.toString().split(".")[1].length}catch(e){}   
    with(Math){   
        r1=Number(arg1.toString().replace(".",""));   
        r2=Number(arg2.toString().replace(".",""));    
        return (r1/r2)*pow(10,t2-t1);   
    }   
}