最初に問題を再現するデモを書きます。私はJSオンラインテスト環境を使用しています[オープン]
displaynum()関数を書き直します
関数displaynum(){var num = 22.77; alert(num + 10);}[表示]ボタンの結果をクリックすると、32.769999999996 nデシマルが表示されます。
22.99 2.777を除き、すべての数字がこの現象を持っているわけではありませんが、これらの数字は特別ではないようです。
いくつかの情報を確認しました。 1つはJSフローティングポイント計算のバグで、もう1つはコンピューターのバイナリ計算への最終的な変換に関連しています。しかし、なぜすべての小数がこの現象を持っていないのですか?今はわかりません。時間があればもっと深く行きます。
現在、2つの解決策があります。 1つ目は、js .tofixed(n)メソッドを使用して、n-桁の小数を直接取得することです。個人的には、この方法にはデータの精度にいくつかの問題があると思います。データの精度要件が高くない場合は、使用できます。 2番目の方法は、独自のJS操作方法を記述することです。
以下はカスタム追加関数です。この方法を追加すると、上記の問題が回避されます。
関数addnum(num1、num2){var sq1、sq2、m; try {sq1 = num1.tostring()。split( "。")[1] .length;} catch(e){sq1 = 0;} try {sq2 = num2.tostring()。 catch(e){sq2 = 0;} m = math.pow(10、math.max(sq1、sq2)); return(num1 * m + num2 * m) / m;}もちろん、アラート((num * 3+10 * 3) /3)として記述することもできます。このようにして、nにはこれ以上の小数はありません。
アラート((num * 3+10 * 3) /3);およびアラート(num+10);アラートとは異なります(num+10);コンピューターを作成するこれらの2つの方法は、最下層のバイナリ操作に変換します。おそらくこれが上記の問題の理由です。
小数点を計算し、複数の小数を表示するJS 10進数に関する上記の記事は、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。