87 行
3.5 KiB
JavaScript
可执行文件
87 行
3.5 KiB
JavaScript
可执行文件
// console.log('1.43', toDecimal(0.95 * 1.5));
|
|
// console.log('2.87', toDecimal(3.82 * 0.75));
|
|
// console.log('2', toDecimal(9.5 * 0.21));
|
|
// console.log('2', toDecimal(9.5 * 0.021));
|
|
// console.log('8.08', toDecimal(9.5 * 0.85));
|
|
// console.log('2.76', toDecimal(0.95 * 2.9));
|
|
// console.log('1.45', toDecimal(1.444999999999));
|
|
// console.log('1.44', toDecimal(1.444699999999));
|
|
// console.log('1.2', toDecimal(1.2));
|
|
// console.log('1.0', toDecimal(1.0));
|
|
// console.log('1.11', toDecimal(1.11));
|
|
// console.log('1.10', toDecimal(1.10));
|
|
// console.log('1.111', toDecimal(1.111));
|
|
// console.log('1.110', toDecimal(1.110));
|
|
// console.log('5.5', toDecimal(5.5, 0));
|
|
// console.log('5.6', toDecimal(5.6, 0));
|
|
// console.log('5.4999999', toDecimal(5.4999999, 0));
|
|
// console.log('5', toDecimal(5, 0));
|
|
// console.log('0.01', toDecimal(0.01, 2));
|
|
// console.log('0', toDecimal(0.000001, 0));
|
|
// console.log('0', toDecimal(0.000001, 2));
|
|
// console.log('0', toDecimal(0, 2));
|
|
|
|
/**
|
|
* 保留任意位小数
|
|
* @param number 数值
|
|
* @param precision 保留小数位数
|
|
* @param toFixed 是否四舍五入
|
|
* @param isNumber 返回值是否为数值类型
|
|
* @returns {any}
|
|
*/
|
|
function toDecimal(number, precision = 2, toFixed = true, isNumber = true) {
|
|
(number == undefined || number == null || number == "" || Number.isNaN(number)) && (number = 0)
|
|
let newNumber = String(number);
|
|
let arr = newNumber.split(".");
|
|
arr[0] == '' && (arr[0] = 0);
|
|
// 如果不是小数,补充对应的0
|
|
if (arr.length === 1) {
|
|
return isNumber ? Number(newNumber) : (newNumber + "." + "0".repeat(precision))
|
|
} else {
|
|
// 如果是小数 但位数比要保留的位数少 也是要补0
|
|
if (arr[1].length <= precision) {
|
|
return isNumber ? Number(newNumber) : (newNumber + "0".repeat(precision - arr[1].length));
|
|
} else {
|
|
|
|
let intNumber = parseInt(arr[0]);// 整数部分
|
|
|
|
let decimal = String(arr[1]);// 所有小数部分
|
|
|
|
let frontDecimal;//有效小数部分
|
|
|
|
if (Number(decimal) == 0) {
|
|
frontDecimal = 0
|
|
} else {
|
|
if (decimal.length <= precision) {
|
|
//小数量小于所需小数位
|
|
frontDecimal = decimal;
|
|
} else {
|
|
//小数量大于所需小数位
|
|
frontDecimal = (precision > 0 ? (decimal.substr(0, precision)) : 0) * 1;
|
|
|
|
let moreDecimal = parseInt(decimal.substr(precision, 1));
|
|
|
|
let spliceNumber = decimal.substr(precision, 5);
|
|
if (spliceNumber === '49999') {
|
|
moreDecimal += 1;
|
|
}
|
|
if (moreDecimal >= 5) {
|
|
frontDecimal += 1;
|
|
}
|
|
//判断小数部位是否需要进位 类似于19.996 保留2位小数 就是20.00
|
|
if (frontDecimal === Math.pow(10, precision)) {
|
|
frontDecimal = '0'.repeat(precision)
|
|
intNumber += 1;
|
|
}
|
|
//处理 0.015 0.009 保留的小数中有0出现的情况
|
|
if (String(frontDecimal).length < precision) {
|
|
frontDecimal = '0'.repeat(precision - String(frontDecimal).length) + frontDecimal
|
|
}
|
|
}
|
|
}
|
|
|
|
return isNumber ? Number(`${intNumber}.${frontDecimal}`) : `${intNumber}.${frontDecimal}`
|
|
}
|
|
}
|
|
}
|