如何简化JavaScript中的舍入?我希望我能以面向对象的方式更优雅地完成它。 toFixed方法运行良好,但没有向后舍入,也返回字符串而不是数字。
pi.toFixed(2).valueOf();
// 3.14
实际上,舍入是一个纠结,因为我必须使用:
pi = Math.round(pi * 100) / 100;
// 3.14
仅仅将方法粘贴到变量的末尾会更好,例如:
pi.round(2);
// 3.1r
答案 0 :(得分:0)
扩展Number.prototype。 Javascript中的数字是与内置对象“Number”关联的数据类型。添加以下polyfill块:
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/
相关:
答案 1 :(得分:0)
首先:不要这样做
扩展内置原型通常是不受欢迎的,因为新标准可能会破坏您的代码。扩展内置原型的库过去曾引起过麻烦。
但是,如果您真的愿意并接受风险,那么添加一个任何标准都不太可能采用的前缀应该是相对安全的。
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
循环中。