toFixed是Javascript中常用來將number 四舍五入為指定小數(shù)位數(shù)的方法栅隐。
例如:
image
但是在實際運用中發(fā)現(xiàn)在四舍五入那一位為5時穆咐,出現(xiàn)了一點問題拓售,例如下圖中1.045進位出現(xiàn)的問題
image
toFeixd在進位時如果需要進位的末尾是5签孔,如果5后不存在或是0則不進位瑰艘,否則進位。
重寫代碼:
export function toFixedFun (data, len){
// debugger
const number = Number(data);
if (isNaN(number) || number >= Math.pow(10, 21)) {
return number.toString();
}
if (typeof (len) === 'undefined' || len === 0) {
return (Math.round(number)).toString();
}
let result = number.toString();
const numberArr = result.split('.');
if (numberArr.length < 2) {
// 整數(shù)的情況
return padNum(result);
}
const intNum = numberArr[0]; // 整數(shù)部分
const deciNum = numberArr[1];// 小數(shù)部分
const lastNum = deciNum.substr(len, 1);// 最后一個數(shù)字
if (deciNum.length === len) {
// 需要截取的長度等于當前長度
return result;
}
if (deciNum.length < len) {
// 需要截取的長度大于當前長度 1.3.toFixed(2)
return padNum(result);
}
// 需要截取的長度小于當前長度僧须,需要判斷最后一位數(shù)字
result = `${intNum}.${deciNum.substr(0, len)}`;
if (parseInt(lastNum, 10) >= 5) {
// 最后一位數(shù)字大于5纲刀,要進位
const times = Math.pow(10, len); // 需要放大的倍數(shù)
let changedInt = Number(result.replace('.', ''));// 截取后轉(zhuǎn)為整數(shù)
changedInt++; // 整數(shù)進位
changedInt /= times;// 整數(shù)轉(zhuǎn)為小數(shù),注:有可能還是整數(shù)
result = padNum(`${changedInt }`);
}
return result;
// 對數(shù)字末尾加0
function padNum(num) {
const dotPos = num.indexOf('.');
if (dotPos === -1) {
// 整數(shù)的情況
num += '.';
for (let i = 0; i < len; i++) {
num += '0';
}
return num;
} else {
// 小數(shù)的情況
const need = len - (num.length - dotPos - 1);
for (let j = 0; j < need; j++) {
num += '0';
}
return num;
}
}
}