ここで何か不足していますか?
var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string
なぜない.toFixed()
文字列を返しますか?
数値を2桁の10進数に丸めたい。
ここで何か不足していますか?
var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string
なぜない.toFixed()
文字列を返しますか?
数値を2桁の10進数に丸めたい。
回答:
2進浮動小数点システムでは、0.1とその累乗(小数部を表示するために使用される)は(少なくとも完全な精度ではなく)表現できないため、文字列を返します。
たとえば、0.1は実際には0.1000000000000000055511151231257827021181583404541015625であり、0.01は実際には0.01000000000000000020816681711721685132943093776702880859375です。(BigDecimal
私のポイントを証明してくれてありがとう。-P)
したがって(10進浮動小数点または有理数型がない場合)、それを文字列として出力することが、表示に必要な精度に正確にトリミングする唯一の方法です。
toFixed
は、数値を文字列に変換し、指定された小数点以下の桁数を使用してフォーマットすることを唯一の目的とするフォーマット関数です。文字列を返す理由は、文字列を返すことになっているためtoStringFixed
です。代わりに名前が付けられていても、OPは結果に驚くことはありません。ここでの唯一の問題は、OPがMath.round
JSリファレンスに問い合わせることなく、のように機能することを期待していたことです。
Number.prototype.toFixed
印刷する前に数値をフォーマットするように設計された関数です。これは、家族からだ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.
// or just copypaste this function to your code:
function toFixedNumber(num, digits, base){
var pow = Math.pow(base||10, digits);
return Math.round(num*pow) / pow;
}
。
または、「ネイティブのような」関数が必要な場合は、プロトタイプを拡張できます。
Number.prototype.toFixedNumber = function(digits, base){
var pow = Math.pow(base||10, digits);
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";
ただし、モジュールには副作用がないため、モジュールを作成するときは、プロトタイプの汚染は悪いと見なされることに注意してください。したがって、モジュールの場合、最初の関数を使用します。
type Number
。事は+(anyValue)
常に数値を返すことです-例えば。+("45")
を返し45
、を+(new Number(42))
返します42
。これは、関数を厳密に入力するようなものです。それを習慣にすれば、多くのバグを回避できます:)
someNumber = Math.round( 42.008 * 1e2 ) / 1e2;
ないが42.01
、それがあります~42.0099999999999980
。理由:番号42.01
は存在せず、最も近い既存の番号に丸められます。ところで、toPrecision(18)
関連するすべての桁で数字を印刷することにより、数字を証明します。
私はこれを変更することでこの問題を解決しました:
someNumber = someNumber.toFixed(2)
...これに:
someNumber = +someNumber.toFixed(2);
ただし、これにより数値が文字列に変換されて再度解析されるため、パフォーマンスに大きな影響があります。パフォーマンスやタイプセーフが気になる場合は、他の回答も確認してください。
someNumber = Math.round(someNumber * 1e2) / 1e2
!より一般的な方法については、私の回答を参照してください。
なぜ使用しないのparseFloat
ですか?
var someNumber = 123.456;
someNumber = parseFloat(someNumber.toFixed(2));
alert(typeof(someNumber));
//alerts number
もちろん文字列を返します。数値変数を丸める場合は、代わりにMath.round()を使用します。toFixedのポイントは、ユーザーに表示するために、固定小数点数で数値をフォーマットすることです。
その主な用途は数字を表示することですか?数値を丸める場合は、Math.round()
適切な係数を使用してください。
'42'
数字であるという意味でのみ...そうではありません。文字列がたまたま数字しか含まないからといって、それが数字になるわけではありません。これはPHPではありません。:-P
これは、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