分析
对 js 有一定了解的人都知道,js 的数字精确度比较低,这就有必要自己去实现一套精确度高的算法了,精确到小数点后几位,是我们经常会用到的,比如价格的计算等,下面来讲讲这个算法的步骤
1、 要进行精度计算,首先要明确输入的是否为数字
2、 需要明确,精确到小数点后几位
3、 明确该数字是否为小数,不是的话,需要根据精度去做补 0 操作
4、 确定该数字后的小数位数是否够精确的小数长度,不够的话,也要做补 0 操作
5、 若该数字既是小数,小数长度又比精度位长,判断截取精度后的小数后一位是否大于五,是的画进一位
6、 满足精度位,小数精度位后一位进位操作确定之后,还需要确定小数部位是否需要进位,是的话,整数部位加 1,小数部位开头替换为 0,不是的话就直接返回
实现
function twoDEcimal(number, precision = 2) { const temp = number; number = Number(number); if (Number.isNaN(number)) { console.log("无效的数字", temp); throw new Error("无效的数字", temp); }
number = String(number); let numbers = number.split("."); if (numbers.length === 1) { return number + "." + "0".repeat(precision); } else { if (numbers[1].length < precision) { return number + "." + "0".repeat(precision - numbers[1].length); } else { let intNumber = parseInt(number.split(".")[0]); let decimal = number.split(".")[1]; let frontDecimal = parseInt(decimal.substr(0, precision)); let lastDecimal = parseInt(decimal.substr(precision, 1)); if (lastDecimal >= 5) { frontDecimal += 1; } if (frontDecimal === Math.pow(10, precision)) { frontDecimal = "0".repeat(precision); intNumber += 1; } frontDecimal = "0".repeat(precision - String(frontDecimal).length) + frontDecimal;
return `${intNumber}.${frontDecimal}`; } } }
let a = twoDEcimal(1.255); console.log(a); a = twoDEcimal(0.005); console.log(a);
|