web-dev-qa-db-ja.com

JavaScript:2つのfloat値の比較

私はこのJavaScript関数を持っています:

Contrl.prototype.EvaluateStatement = function(acVal, cfVal) {

    var cv = parseFloat(cfVal).toFixed(2);
    var av = parseFloat(acVal).toFixed(2);

   if( av < cv) // do some thing
}

浮動小数点数を比較するとav=7.00およびcv=12.00 結果として 7.00<12.00false

何かアイデアはありますか?

28
Harold Sota

toFixedは文字列を返し、結果の2つの文字列を比較しています。字句的には、12分の1は7の前に来るため、12 <7になります。

次のようなものを比較したいと思います:

(Math.round(parseFloat(acVal)*100)/100)

小数点以下2桁に丸めます

36
second

浮動小数点数と精度を比較します。

var precision = 0.001;

if (Math.abs(n1 - n2) <= precision) {
  // equal
}
else {
  // not equal
}

UPD:または、数値の1つが正確な場合は、精度を相対誤差と比較します

var absoluteError = (Math.abs(nApprox - nExact)),
  relativeError = absoluteError / nExact;

return (relativeError <= precision);
10
Edward

Math.fround()関数は、数値の最も近い32ビットの単精度浮動小数点表現を返します。

したがって、2つのフロートを比較するのに最適な選択肢の1つです。

if (Math.fround(1.5) < Math.fround(1.6)) {
    console.log('yes')
} else {
    console.log('no')
}

>>> yes

// More examples:
console.log(Math.fround(0.9) < Math.fround(1));                            >>> true
console.log(Math.fround(1.5) < Math.fround(1.6));                          >>> true
console.log(Math.fround(0.005) < Math.fround(0.00006));                    >>> false
console.log(Math.fround(0.00000000009) < Math.fround(0.0000000000000009)); >>> false
2
George C.

短い表記法を使用して浮動小数点数を比較し、浮動小数点数を文字列および整数としても受け入れます:

var floatOne = 2, floatTwo = '1.456';

Math.floor(floatOne*100) > Math.floor(floatTwo*100) 

(!)注:比較は整数を使用して行われます。実際に舞台裏で何が起こるか:200 > 145

10進数の精度を上げるには、100をゼロで拡張します。たとえば、小数点以下3桁の精度には1000を使用します。

テスト:

var floatOne = 2, floatTwo = '1.456';
console.log(Math.floor(floatOne*100), '>', Math.floor(floatTwo*100), '=', Math.floor(floatOne*100) > Math.floor(floatTwo*100));
2
Alph.Dev