/**
* @description 对数字保留小数点后几位
* @param {String|Number} number 需要保留小数点的数值
* @param {Number} precision 保留小数点后几位 默认 2 位
* @returns {String} 保留后的数值字符串
* @example
* toFixed(0.105,2) => "0.11"
* toFixed('0.105',4) => "0.1050"
* toFixed(0.105) => "0.11"
*/
function toFixed(number, precision=2) {
//原有的toFixed会有问题,如 0.105.toFixed(2) = 0.1 // 不是 0.11
// toPrecision 方法不太好实现,比如 0.105.toPrecision(2) //0.1 0.105.toPrecision(3) // 0.105
// Math.round 应注意负数问题 如 Math.round(-10.5) // -10 但是 Math.round(10.5) // 11
const isNegativeNumber= Number(number) <0 ;
const originNumberStrHasNotSign=String(Math.abs(number));
const fixedNumberStrNotSign=String(Math.round(+originNumberStrHasNotSign + 'e' + precision) / Math.pow(10, precision));
const realIntegerPart = fixedNumberStrNotSign.split('.')[0];
const realIntegerPartLength = realIntegerPart? realIntegerPart.length :0;
const realPrecisionPart = fixedNumberStrNotSign.split('.')[1] ? fixedNumberStrNotSign.split('.')[1] :'';
const realPrecisionLength = realPrecisionPart ? realPrecisionPart.length : 0;
// 1 无小数时
if(!realPrecisionPart){
// 1.1 精度故意传0时
if(precision ===0){
return isNegativeNumber ? `-${realIntegerPart}`: `${realIntegerPart}`
}
// 1.2 精度不为0时
return isNegativeNumber ? `-${realIntegerPart}.`.padEnd(realIntegerPartLength+precision+2,'0') : `${realIntegerPart}.`.padEnd(realIntegerPartLength+precision+1,'0')
}
// 2 有小数时
// 2.1 不需要补充0
if(realPrecisionLength === precision){
return isNegativeNumber ? `-${fixedNumberStrNotSign}`:fixedNumberStrNotSign
}else {
// 2.2 需要补充0
return isNegativeNumber ? `-${realIntegerPart}.${realPrecisionPart.padEnd(precision,'0')}` : `${realIntegerPart}.${realPrecisionPart.padEnd(precision,'0')}`
}
}
export default toFixed;