これを約 5 桁の精度に制限したいようです。これはより明示的にそうするかもしれません:
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
もちろん、必要に応じて、これらを 2 つの引数の関数に組み合わせることができます。
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
)