さて、私たちは皆、次のような浮動小数点数の問題を知っています:
0.23 - 1 + 1 = 0.22999999999999998
また、JavaScript では、他の言語とは異なり、すべての数値が実際には浮動小数点であり、int/decimal がないため、この問題を処理する BigDecimal などのあらゆる種類のライブラリと回避策があります。これについては、ここで説明するのが最適です。
浮動小数点数をサポートする「数値スピナー」コントロールを作成していましたが、明らかに、ユーザーが「上」をクリックしてから「下」をクリックして、最初とは異なる数値を取得したくないので、回避策 - 一種の「addPrecise」メソッド。
私の考えは次のとおりでした。
- 加算しようとしている 2 つの数値を取り、それらの「精度」、つまり小数点以下の桁数を計算します。
- 2 つの数値を float として追加します
toFixed()
2 つの最大精度で結果に適用する
例えば:
float #1: 1.23
float #2: -1
それらを追加すると通常は結果になります0.22999999999999998
が、小数点以下の最大桁数、つまり#1の2桁toFixed(2)
を取得して適用すると、0.23
希望どおりになります。
次のコードでこれを行いましたが、満足していません。
function addPrecise(f1, f2){
var floatRegex = /[^\d\-]/;
var f1p = floatRegex.exec(f1.toString()) ? f1.toString().split(floatRegex.exec(f1.toString()))[1].length : 0;
var f2p = floatRegex.exec(f2.toString()) ? f2.toString().split(floatRegex.exec(f2.toString()))[1].length : 0;
var precision = Math.max(f1p,f2p);
return parseFloat((parseFloat(f1) + parseFloat(f2)).toFixed(precision));
}
(他のロケールではピリオドではなくコンマである可能性があるため、「浮動小数点」を見つけるために正規表現を使用していることは注目に値します。また、Int を取得した可能性も考慮しています (ポイントなし) ) その場合、精度は 0 です。)
これを行うためのよりクリーン/シンプル/より良い方法はありますか?
編集:また、10 進数の桁数を抽出する信頼できる方法を見つけることも問題の一部であることを指摘したいと思います。私はそこに私の方法について確信が持てません。