问:为啥写JavaScript的去尾法,网上有一大堆“JS保留小数 去尾法 进一法 四舍五入法”不够我抄的吗?
答:网上找的那段代码,经过一段时间的使用后,发现js浮点数运算不精确,比如将39.8保留两位小数,居然变成了39.79。为了不再继续掉入别人挖的坑,也为了不让新人入坑,决定重写JavaScript的去尾法。如果有不完善的地方,欢迎大家在评论区指正。
工具:Google浏览器 版本 105.0.5195.127(正式版本) (64 位)
去尾法
这是我的原创方法,返回字符串,如果有不完善的地方,欢迎大家在评论区指正。
//去尾法
Number.prototype.toFloor = function (num) {
if (num < 0) {
return this;
}
let nnum = Number.parseFloat(this);
let str = nnum.toString();
let arr = str.split(".");
let strZ = arr[0];//arr[0] 整数部分,arr[1] 小数部分
let strX = ""; //小数点与小数部分
if (arr.length > 1) {//有小数
if (num > 0) {
if (arr[1].length >= num) {//小数长,保留位短
strX = arr[1].substr(0, num);
} else {//小数短,保留位长
let zeroArr = [];
for (let i = 0; i < num - arr[1].length; i++) {
zeroArr.push(0);
}
strX = arr[1].toString() + zeroArr.join("");
}
strX = "." + strX;
}
} else {//无小数
if (num > 0) {
let zeroArr = [];
for (let i = 0; i < num; i++) {
zeroArr.push(0);
}
strX = "." + zeroArr.join("");
}
}
let result = strZ + "" + strX;
return result;
};
以下是抄袭网络1…
进一法
抄袭网络,如有不足,请指正。
//进一法
Number.prototype.toCeil = function (num) {
return Math.ceil(this * Math.pow(10, num)) / Math.pow(10, num);
};
四舍五入法
我觉得toFixed(num)就很好用啊。
注意:数字.toFiexed(小数位数)返回字符串。
toFixed
1.235.toFixed(2) = 1.24//Google浏览器版本 105.0.5195.127(正式版本) (64 位)结果是 1.24,结果正确。
1.2350001.toFixed(2) = 1.24
抄袭网络
//四舍五入法
Number.prototype.toRound = function (num) {
return Math.round(this * Math.pow(10, num)) / Math.pow(10, num);
};
批评疯传已久的去尾法
//去尾法
Number.prototype.toFloor = function (num) {
return Math.floor(this * Math.pow(10, num)) / Math.pow(10, num);
};
//举例,将39.8保留两位小数
Math.floor(39.8 * Math.pow(10, 2)) / Math.pow(10, 2); //39.79
Math.floor(38.8 * Math.pow(10, 2)) / Math.pow(10, 2); //38.79
//39.80 * 100 = 3979.9999999999995
参考文献
JS保留小数 去尾法 进一法 四舍五入法[DB|OL]. https://www.cnblogs.com/nbgzc/p/5261015.html ↩︎