ここに何かが足りませんか?
var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string
Why.toFixed()
は文字列を返しますか?
数値を2桁の10進数に丸めます。
0.1とその累乗(小数の表示に使用される)がバイナリ浮動小数点システムで表現できない(少なくとも完全な精度ではない)ため、文字列を返します。
たとえば、0.1は実際には0.1000000000000000055511151231257827021181583404541015625であり、0.01は実際には0.01000000000000000020816681711721685132943093776702880859375です。 (私のポイントを証明してくれたBigDecimal
に感謝します。:-P)
したがって(10進浮動小数点または有理数型がない場合)、文字列として出力することが、表示に必要な精度に合わせてトリミングする唯一の方法です。
Number.prototype.toFixed
は、印刷する前にformat数値に設計された関数です。 toString
、 toExponential
、および 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";
ただし、モジュールを作成するときは、モジュールに副作用がないため、プロトタイプの汚染は悪いと見なされることに注意してください。
これを変更してこの問題を解決しました。
someNumber = someNumber.toFixed(2)
...これに:
someNumber = +someNumber.toFixed(2);
ただし、これは数値を文字列に変換して再度解析するため、パフォーマンスに大きな影響があります。パフォーマンスやタイプセーフティを気にする場合は、他の回答も確認してください。
parseFloat
を使用しないのはなぜですか?
var someNumber = 123.456;
someNumber = parseFloat(someNumber.toFixed(2));
alert(typeof(someNumber));
//alerts number
もちろん、文字列を返します。数値変数を丸めたい場合は、代わりにMath.round()を使用します。 toFixedのポイントは、固定された小数点以下の桁数でフォーマットすることですユーザーへの表示用。
JavaScriptのNumber()
関数を使用して数値に戻すことで解決しました
var x = 2.2873424;
x = Number(x.toFixed(2));
数値をフォーマットすることになっている場合、何を返すと期待しますか?番号がある場合は、_2 == 2.0 == 2.00
などのため、ほとんど何もできません。したがって、文字列でなければなりません。
結果を数値に変換するには、単に「+」を使用します。
var x = 22.032423;
x = +x.toFixed(2); // x = 22.03
その主な用途は数字を表示するためですか?数値を丸める場合は、Math.round()
を適切な要素とともに使用します。
それが文字列でなければならない理由の例を提供するには:
1.toFixed(2)をフォーマットすると、「1.00」になります。
1には2桁の小数がないため、これは1とは異なります。
JavaScriptは正確にはパフォーマンス言語ではないことを知っていますが、次のようなものを使用すると、丸めのパフォーマンスが向上する可能性があります:roundedValue = Math.round(value * 100)* 0.01
提供される回答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