あなたがしようとしているのは、2つの数字が実質的に同等であるかどうかを判断する場合は、誤差の余裕がなければなりません。これを行う1つの方法は、数値の差を計算し、その差が重要かどうかを判断することです。
したがって、前回の数値から、これらの数値の差を減算して評価することができました。私たちはこの違いの兆候を本当に気にしないので、私は先に進んで違いの絶対的な価値を得るでしょう。
Math.abs(4.0329146112660565e+26 - 4.0329146112661e+26) === 4329327034368
(追記:今、理由を説明する時間はありませんが、JavaScriptで==演算子は混乱とエラーが発生しやすい行動を持っている、あなたが値を比較したい場合===使用)
その差は大きい数字ですが、最初の数字がどれほど大きいかに関係なく、それは重要ではありません。直感的に、私はそうのような独自の番号の最小によって違いを分割するように誘惑しています:
4329327034368/4.0329146112660565e+26 === 1.0734983136696987e-14
かなり少ないように見えます。一連の値で同じ操作を繰り返し、エラーのマージンをどのようにしたいかを判断できるはずです。そして、あなたがしなければならないことは、任意の数字で同じ操作を行い、その "差異比"があなたのために十分に小さいかどうかを見ることです。
function similar(a, b) {
let diff = Math.abs(a - b);
let smallest = Math.min(Math.abs(a), Math.abs(b));
let ratio = diff/smallest;
return ratio < MARGIN_OF_ERROR;
}
ここで、2つの数字の違いの重要性を判断する方法を考え出しました。それを計算するのは非常に賢明な方法ではないかもしれませんが、状況によっては適切かもしれないし、他の状況では適切でないかもしれません。しかし、一般的な考え方は、2つの値が "close"という独自の定義で十分に近いかどうかを判断する関数を作る必要があることです。
JavaScriptは数学で扱える最悪の言語の1つです。Number.MAX_SAFE_INTを超えると整数は不正確になります(Chromeでは9007199254740991と思われますが、ブラウザやそれが標準化された定数の場合)。
https://github.com/MikeMcl/bignumber。js/ – shotgunner
数字を文字列に変換して比較することができます – guest271314
**平等**とはどういう意味ですか?厳密に等しい?またはいくつかの桁で等しい?固定精度内で等しいか等しいか?お互いに丸めることができる数字ですか?指定してください –