重写JS保留小数-去尾法

问:为啥写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

参考文献


  1. JS保留小数 去尾法 进一法 四舍五入法[DB|OL]. https://www.cnblogs.com/nbgzc/p/5261015.html ↩︎

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值