[removed] Comparing two float values

前端 未结 4 1777
忘了有多久
忘了有多久 2020-12-09 01:55

I have this JavaScript function:

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

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


        
相关标签:
4条回答
  • 2020-12-09 02:33

    Comparing floats using short notation, also accepts floats as strings and integers:

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

    (!) Note: Comparison happens using integers. What actually happens behind the scenes: 200 > 145

    Extend 100 with zero's for more decimal precision. For example use 1000 for 3 decimals precision.

    Test:

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

    0 讨论(0)
  • 2020-12-09 02:33

    The Math.fround() function returns the nearest 32-bit single precision float representation of a Number.

    And therefore is one of the best choices to compare 2 floats.

    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
    
    0 讨论(0)
  • 2020-12-09 02:45

    Compare float numbers with precision:

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

    UPD: Or, if one of the numbers is precise, compare precision with the relative error

    var absoluteError = (Math.abs(nApprox - nExact)),
      relativeError = absoluteError / nExact;
    
    return (relativeError <= precision);
    
    0 讨论(0)
  • 2020-12-09 02:50

    toFixed returns a string, and you are comparing the two resulting strings. Lexically, the 1 in 12 comes before the 7 so 12 < 7.

    I guess you want to compare something like:

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

    which rounds to two decimals

    0 讨论(0)
提交回复
热议问题