js保留指定有效小数位数
最近有个需求是 判断整数部分是否为0, 大于0则保留2位小数, 是0,取小数点后两位有效数(0不是有效数), 0.0109 -> 0.011
在网上找不到解决方法, 以下是自己实现的方法:
/*
判断整数部分是否为0, 大于0则保留2位小数, 是0,取小数点后两位有效数(0不是有效数), 0.0109 -> 0.011
* ping: 要处理的数
* places: 要保留的有效小数位
*/
function handleDecimalParts(ping, places) {
// 1. 判断整数部分是否为0
const res = parseInt(ping);
var residue = "";
// 保留部分
var handleRes = [];
var finalRes = "";
if (res == 0) {
ping = ping + "";
// 包含小数点
if (ping.indexOf(".") != -1) {
// 保留小数点后两位有效数字
var pingArr = ping.split(".");
// 取小数部分
const decimalPart = pingArr[1];
residue = getResidue(2, decimalPart, handleRes);
// 判断是否需要四舍五入
if (residue && residue[0] >= 5) {
var val1 = ["1"];
for (var i = 0; i < handleRes.length; i++) {
val1.push("0");
}
let multiplier = +val1.join("");
// 需要四舍五入
let joinStr = handleRes.join("");
joinStr = "0." + joinStr;
joinStr = +joinStr;
// 进位+1
let temp = joinStr * multiplier + 1;
// 最终结果
finalRes = temp / multiplier;
} else {
var val1 = ["1"];
for (var i = 0; i < handleRes.length; i++) {
val1.push("0");
}
let multiplier = +val1.join("");
// 需要四舍五入
let joinStr = handleRes.join("");
joinStr = "0." + joinStr;
joinStr = +joinStr;
// 进位+1
let temp = joinStr * multiplier;
// 最终结果
finalRes = temp / multiplier;
}
}
} else {
console.log("存在整数部分:保留两位小数" + ping);
//Number(ping).toFixed(2);
finalRes = roundFun(Number(ping), 2);
}
console.log("-----最终结果--------" + finalRes);
return finalRes;
}
//保留n位小数
function roundFun(value, n) {
return Math.round(value * Math.pow(10, n)) / Math.pow(10, n);
}
/*对小数部分进行处理*/
function getResidue(places, decimalPart, handleRes) {
let residue = decimalPart;
for (var i = 0; i < places; i++) {
// 取出小数部分到第一个不是0的位置
for (var j = 0; j < residue.length; j++) {
if (residue[j] != 0) {
residue = residue.substr(j);
break;
} else {
handleRes.push(residue[j]);
}
}
if (residue) {
handleRes.push(residue[0]);
residue = residue.substr(1);
}
}
return residue;
}
- 调用
const res = handleDecimalParts(0.0109, 2);
console.log(res)