この記事は、もともとDavid Kayeのブログ
に掲載されました試したすべてのJavaScript環境(Chrome、Firefox、Internet Explorer、Brave、node.js)でnumber()。tofixed()で丸めエラーを見つけました。驚くべきことに、修正は非常に簡単です。読み続けます...
intl.numberformat#format()と同じ関数を実行するデジタルフォーマット関数を変更すると、tofixed()でこのバージョンで丸めエラーが見つかりました。
(1.015).toFixed(2) // 返回 "1.01" 而不是 "1.02"
障害のあるテストは、ここに42行目にあります。 2017年12月まで見つかりませんでした。これにより、他の問題を確認するようになりました。
この質問についての私のツイートを参照してください:
tofixed()を使用する場合、エラー報告の長い履歴があります。
この問題に関するスタックフローの問題の短い例をいくつか紹介します。
aa値のエラーを指摘していますが、エラーの結果を返す値の範囲やパターンはありません(少なくとも私はそれを見つけませんでした、私は何かを逃したかもしれません)。これにより、プログラマーは小さな問題に焦点を合わせ、より大きなパターンが表示されません。私はこれを責めません。
パターンを見つけますテスト関数
(1.015).toFixed(2) // 返回 "1.01" 而不是 "1.02"
次の例では、整数1〜128で操作を実行し、各整数に10進数.015を追加し、「予期しない」結果の結果を返します。各結果には、指定、予想、および実際のフィールドが含まれます。ここでは、その配列を使用して各アイテムを印刷します。
function test({fraction, maxValue}) { fraction = fraction.toString() var fixLength = fraction.split('.')[1].length - 1 var last = Number(fraction.charAt(fraction.length - 1)) var fixDigit = Number(fraction.charAt(fraction.length - 2)) last >= 5 && (fixDigit = fixDigit + 1) var expectedFraction = fraction.replace(/[\d]{2,2}$/, fixDigit) return Array(maxValue).fill(0) .map(function(ignoreValue, index) { return index + 1 }) .filter(function(integer) { var number = integer + Number(fraction) var actual = number.toFixed(fixLength) var expected = Number(number + '1').toFixed(fixLength) return expected != actual }) .map(function(integer) { var number = Number(integer) + Number(fraction) return { given: number.toString(), expected: (Number(integer.toFixed(0)) + Number(expectedFraction)).toString(), actual: number.toFixed(fixLength) } }) }
この状況では、6つの予期しない結果があります。
test({ fraction: .015, maxValue: 128 }) .forEach(function(item) { console.log(item) })
小数部の最後の重要な数字は5(.015および.01500が同じ結果を生成する必要があります)。
で失敗します .035で終わるツイスト数が1で失敗し、その後32〜128
.045で終わるツイスト数が1〜15、その後128すべての実装が変更される前に、これを行う意思がある場合(誰もが望んでいるわけではありません)、次のポリフィルでtofixed()をオーバーライドできます。
またはこの記事を開始する最初の変換を実行するだけです。
お読みいただきありがとうございます!JavaScriptのnumber.tofixed()Method
number.tofixed()メソッドで丸めエラーを修正する1つの方法は、カスタム丸め関数を使用することです。この関数は、JavaScriptのデジタル処理の特性を考慮し、より正確な結果を提供できます。たとえば、数値に10のパワーを掛け、最寄りの整数に丸めて、同じパワー10で分割する関数を使用できます。
いいえ、number.tofixed()メソッドは数値でのみ使用できます。非数値でそれを使用しようとすると、JavaScriptはtypeRrorを投げます。数値ではない値でこのメソッドを使用する必要がある場合は、最初に値が数字であるかどうかを確認する必要があります。
number.tofixed()メソッドとその他の丸めメソッドのパフォーマンスの違いは無視できます。ただし、多くの操作を行っている場合、カスタム丸め関数を使用すると、number.tofixed()メソッドを使用するよりもわずかに高速になる場合があります。
いいえ、number.tofixed()メソッドは、最大20桁の場所にしか丸められません。 20以上の小数の場所に丸めようとすると、JavaScriptは範囲を投げます。
number.tofixed()メソッドは、正の数値を扱うのと同じように負の数字を処理します。指定された小数の小数の数の絶対値を丸め、否定的な符号を追加します。
はい、number.tofixed()メソッドはJavaScriptの標準部分であり、すべてのJavaScript環境で利用できるはずです。ただし、JavaScriptエンジンが異なるため、数値が異なるため、結果はすべての環境でまったく同じではない場合があります。
引数をnumber.tofixed()メソッドに渡さない場合、デフォルトでは10小数点に丸められます。これは、数字を最も近い整数に丸めることを意味します。
はい、多数のnumber.tofixed()メソッドを使用できます。ただし、JavaScriptは最大2^53〜1までの数値のみを正確に表すことができることを忘れないでください。この数値よりも大きい番号でnumber.tofixed()メソッドを使用しようとすると、正確な結果が得られない場合があります。
以上がnumber()。tofixed()丸めエラー:壊れているが修正可能の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。