如何在 JavaScript 中简化舍入?我希望我能以面向对象的方式更优雅地做到这一点。toFixed 方法运行良好,但没有向后舍入,它还返回字符串而不是数字。
pi.toFixed(2).valueOf();
// 3.14
实际上,舍入有点纠结,因为我必须使用:
pi = Math.round(pi * 100) / 100;
// 3.14
相反,将方法粘贴到变量的末尾会更好,例如:
pi.round(2);
// 3.1r
Extend Number.prototype.Javascript 中的数字是与内置对象"Number"关联的数据类型。添加以下填充物块:
if (!Number.prototype.round) {
Number.prototype.round = function (decimals) {
if (typeof decimals === 'undefined') {
decimals = 0;
}
return Math.round(
this * Math.pow(10, decimals)
) / Math.pow(10, decimals);
};
}
在此之后的任何地方,您可以通过将 .round() 粘贴到数字的末尾来对数字进行四舍五入。它有一个确定小数位数的可选参数。例如:
pi.round(2);
您还可以对负数使用向后舍入,例如:
x = 54321;
x.round(-4);
// 50000
小提琴:http://jsfiddle.net/g2n2fbmq/
相关:
- Javascript 将数字转换为不同的格式或字符串替代
- 在javascript和Math对象中扩展Number.prototype?
- 整数原型
首先:不要这样做
扩展内置原型通常不受欢迎,因为新标准可能会破坏您的代码。扩展内置原型的库在过去造成了麻烦。
但是,如果您真的想要并接受风险,那么添加任何标准都不太可能采用的前缀应该是相对安全的。
if (!Number.prototype.$round) {
Object.defineProperty(Number.prototype, '$round', {
value(precision) {
return +this.toFixed(precision)
},
})
}
(123.456789).$round(2) // 123.45
通过在属性前面加上 $
,如果代码是标准化的,您的代码将继续工作Number#round()
。
我使用 Object.defineProperty
而不是 =
,因为它使属性在默认情况下不可枚举。这意味着它不会出现在for..in
循环中。