[JS] Number.prototype.toFloor 有什么坑?

[复制链接]
查看: 9835   回复: 6
发表于 2021-12-16 07:35:30 | 显示全部楼层 |阅读模式
  1. Number.prototype.toFloor = function (num) {        return Math.floor(this * Math.pow(10, num)) / Math.pow(10, num);}
复制代码
js 自带的保留 n 位小数.toFixed 是进一法。 网上找去尾法,找到上述那个,但是博客主形容它为“批评疯传已久的去尾法”,但是没给原因。 有大神知道什么原因吗?
回复

使用道具 举报

 楼主| 发表于 2021-12-16 07:36:10 | 显示全部楼层
附一段别人的代码
字符串截取方案:
  1. var retain=function (num,decimal){        num = num.toString();        let index = num.indexOf('.');        if(index !== -1){            num = num.substring(0,decimal + index + 1)        }else{            num = num.substring(0)        }        return parseFloat(num).toFixed(decimal) }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-16 07:36:33 | 显示全部楼层
JS的神奇问题导致的
  1. JS:7*0.8 !==5.6
复制代码
然后就会有奇怪的结果:
  1. Math.floor(39.8 * Math.pow(10, 2)) / Math.pow(10, 2); //39.79//39.80 * 100 = 3979.9999999999995
复制代码
导致结果就是39.8,保留两位小数,结果变成了39.79。预期应该还是39.8才对

---代码源自网络
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-16 07:36:53 | 显示全部楼层
多谢大神
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-16 07:37:04 | 显示全部楼层
floor是做数**算,会出现丢失精度问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-16 07:38:03 | 显示全部楼层
经典问题 https://stackoverflow.com/a/61764752
  1. > .1+.2< 0.30000000000000004
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-16 07:38:11 | 显示全部楼层
我用你这个,构建了一下,挺好用:
  1. Number.prototype.toFloor = function (decimal) {        let num = this.toString();        let index = num.indexOf('.');        if(index !== -1){                num = num.substring(0, decimal + index + 1)        } else {                num = num.substring(0)        }        return parseFloat(num).toFixed(decimal)}
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则