JavaScript浮点数运算
2019-01-15 本文已影响0人
米米1498
单精度&双精度
- 单精度
1符号位、8指数、23小数
- 双精度
1符号位、11指数、52小数
浮点数
- 概念:
浮点数就是小数的二进制表示法;
指数位决定取值范围;
小数位决定精度; - 有效数字位:
二进制数有效数字的第一位默认总是1,不保存在小数位中;
故双精度浮点数的有效数字位是53;
小数的计算:
0.1+0.2
1、十进制——>二进制
0.000100......(无限)+0.00......(无限)
2、将二进制结果截取53位有效数字
3、二进制结果——>十进制数;
0.30000000000000004
整数的计算:
需在1-2^53, 2^53-1的范围内,超出范围也会出现被舍去的精度问题
Math.js类库
-
Math.abs(x) 返回x的绝对值
-
Math.round() 四舍五入
Math.ceil() 向上舍入
Math.floor() 向下舍入 -
Math.pow(x,y) x的y次幂
其他js运算方法
- NumberObject.toFixed(x)
返回,四舍五入为x个小数位的数值。
格式化数字方法
/*
* 保留n位小数,默认2位
* 123.132 => 123.13
*/
//eg.调用setDecimalBit(1998.888777),返回1998.89
export const setDecimalBit=(number,n=2)=>{
if(isNumber(number)){
number=(Math.round( number*Math.pow(10,n) )* Math.pow(0.1,n));//eg.jslog:1998.8900000000003
number=number..toFixed(n);//eg.jslog:1998.89
number=number.split('.');
number=[number[0],number[1].slice(0,n)].join('.');
};
return number;
};
/*
* 格式化数字,用于前端展示 9,872,980.00 =>9,872,900
* @s 保留n位小数
*/
//eg.调用formatNumber(1998.888777),返回1,998.89
export const formatNumber=(num,s=2)=>{
if(判断num是否为数字){
num=setDecimalBit((num),s);
num=num.toString().split('.');
//eg.jslog:num=1998,89
let m=num[0].split('').reverse();
//eg.jslog:m=8,9,9,1
for(let i=1,j=0,q=Math.ceil(m.length/3);i<q;i++){
m.splice(3*i+j,0,',');
//eg.jslog:i=0,j=1,m=8,9,9,,,1
j++;
};
m=m.reverse().join('');//eg.jslog:m=1,998
if(num[1]){
m=[m,num[1]].join('.');
};
return m;
};
return num;
};