您似乎确实希望将其限制为大约五个精度位置。这可能会更明确地这样做:
var toPrecision = function(precision) {
return function(nbr) {
if (typeof nbr !== 'number') return 0; //???
if (nbr === 0) return 0;
var abs = Math.abs(nbr);
var sign = nbr / abs;
nbr = abs;
var digits = Math.ceil(Math.log(nbr)/Math.LN10);
var factor = Math.pow(10, precision - digits);
var result = nbr * factor;
result = Math.round(result, 0);
return result / factor;
};
};
var format_output = toPrecision(5);
format_output(1234567.89012); // 1234600
format_output(987.654321); // 987.65
format_output(-.00246813579); // -0.0024681
当然,如果您愿意,可以将它们组合成一个有两个参数的函数:
var toPrecision = function(nbr, precision) {
if (typeof nbr !== 'number') return 0; //???
if (nbr === 0) return 0;
var abs = Math.abs(nbr);
var sign = nbr / abs;
nbr = abs;
var digits = Math.ceil(Math.log(nbr)/Math.LN10);
var factor = Math.pow(10, precision - digits);
var result = nbr * factor;
result = Math.round(result, 0);
return result / factor;
};
toPrecision(1234567.89012, 5); // 1234600
或者,如果它使您的船漂浮,您可以将其附加到 Math 对象:
Math.toPrecision = function(nbr, precision) {
// ...
}
更新(2020 年 5 月)
许多年后,随着 ES6 的普及,我会以不同的方式来写这个。它可能看起来像这样:
var toPrecision = (precision) => (nbr, _, __, powerOf10) =>
nbr === 0
? 0
: (
powerOf10 = 10 ** (precision - Math .ceil (Math .log10 (Math .abs (nbr)))),
Math .round (nbr * powerOf10) / powerOf10
)