web-dev-qa-db-ja.com

JavaScriptで数値を丸めるにはどうすればよいですか? .toFixed()は文字列を返しますか?

ここに何かが足りませんか?

var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string

Why.toFixed()は文字列を返しますか?

数値を2桁の10進数に丸めます。

144
Derek Adair

0.1とその累乗(小数の表示に使用される)がバイナリ浮動小数点システムで表現できない(少なくとも完全な精度ではない)ため、文字列を返します。

たとえば、0.1は実際には0.1000000000000000055511151231257827021181583404541015625であり、0.01は実際には0.01000000000000000020816681711721685132943093776702880859375です。 (私のポイントを証明してくれたBigDecimalに感謝します。:-P)

したがって(10進浮動小数点または有理数型がない場合)、文字列として出力することが、表示に必要な精度に合わせてトリミングする唯一の方法です。

111

Number.prototype.toFixed は、印刷する前にformat数値に設計された関数です。 toStringtoExponential 、および toPrecision のファミリーからのものです。

数値を四捨五入するには、次のようにします。

someNumber = 42.008;
someNumber = Math.round( someNumber * 1e2 ) / 1e2;
someNumber === 42.01;

// if you need 3 digits, replace 1e2 with 1e3 etc.

または、native-like関数が必要な場合は、プロトタイプを拡張できます。

Number.prototype.toFixedNumber = function(x, base){
  var pow = Math.pow(base||10,x);
  return Math.round(this*pow) / pow;
}
someNumber = 42.008;
someNumber = someNumber.toFixedNumber(2);
someNumber === 42.01;


//or even hexadecimal

someNumber = 0xAF309/256  //which is af3.09
someNumber = someNumber.toFixedNumber(1, 16);
someNumber.toString(16) === "af3.1";

ただし、モジュールを作成するときは、モジュールに副作用がないため、プロトタイプの汚染は悪いと見なされることに注意してください。

138
m93a

これを変更してこの問題を解決しました。

someNumber = someNumber.toFixed(2)

...これに:

someNumber = +someNumber.toFixed(2);

ただし、これは数値を文字列に変換して再度解析するため、パフォーマンスに大きな影響があります。パフォーマンスやタイプセーフティを気にする場合は、他の回答も確認してください。

106
Eve juan

parseFloat を使用しないのはなぜですか?

var someNumber = 123.456;
someNumber = parseFloat(someNumber.toFixed(2));
alert(typeof(someNumber));
//alerts number
23
sirlunchalot

もちろん、文字列を返します。数値変数を丸めたい場合は、代わりにMath.round()を使用します。 toFixedのポイントは、固定された小数点以下の桁数でフォーマットすることですユーザーへの表示用

12
Joel Coehoorn

JavaScriptのNumber()関数を使用して数値に戻すことで解決しました

var x = 2.2873424;
x = Number(x.toFixed(2));
11
Nizar

数値をフォーマットすることになっている場合、何を返すと期待しますか?番号がある場合は、_2 == 2.0 == 2.00などのため、ほとんど何もできません。したがって、文字列でなければなりません。

3
Tomas Vana

結果を数値に変換するには、単に「+」を使用します。

var x = 22.032423;
x = +x.toFixed(2); // x = 22.03
3
meisam

その主な用途は数字を表示するためですか?数値を丸める場合は、Math.round()を適切な要素とともに使用します。

2
Christoph

それが文字列でなければならない理由の例を提供するには:

1.toFixed(2)をフォーマットすると、「1.00」になります。

1には2桁の小数がないため、これは1とは異なります。


JavaScriptは正確にはパフォーマンス言語ではないことを知っていますが、次のようなものを使用すると、丸めのパフォーマンスが向上する可能性があります:roundedValue = Math.round(value * 100)* 0.01

2
Pyro

提供される回答m93aのもう少し機能的なバージョンを次に示します。

const toFixedNumber = (toFixTo = 2, base = 10) => num => {
  const pow = Math.pow(base, toFixTo)
  return +(Math.round(num * pow) / pow)
}

const oneNumber = 10.12323223

const result1 = toFixedNumber(2)(oneNumber) // 10.12
const result2 = toFixedNumber(3)(oneNumber) // 10.123

// or using pipeline-operator
const result3 = oneNumber |> toFixedNumber(2) // 10.12
1
Sartaj