在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); } }