in reply to number comparison with a twist

You can just change the == to eq. Because $num2 is not a floating point

Replies are listed 'Best First'.
Re^2: number comparison with a twist
by LanX (Saint) on Mar 02, 2020 at 15:02 UTC
    > Because $num2 is not a floating point

    $num2 is a float with rounding error after already before the multiplication.

    Just the string representation will ignore the rounding error hence eq will work here.

    I that's reliable for all cases? I don't dare saying.

    DB<4> $num2 ="19.90" DB<5> printf "%.20f", $num2*100 1989.99999999999980000000 DB<6> p 1990 == $num2 *100 DB<7> p 1990 eq $num2 *100 1 DB<8> say ">". $num2 *100 ."<" >1990< DB<9>

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery

      $num2 is a float with rounding error after the multiplication.

      I am not so sure about that.

      print "1989.9999999999998" + 0 ; # 1990

      The 'target form' is decimal string.

      From perlnumber Target form: If the source number can be represented in the target form, that representation is used.

      Also: When a numeric value is passed as an argument to such an operator, it will be converted to the format understood by the operator.. My assumption is that this counts for  + - / * etc applied to the decimal string and eventually also for eq.

        The print is showing the string representation only, where rounding errors are smoothed away in a DWIM way.

        Try printf "%.20f",$var to see the rounding errors pertaining after +0.

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        Wikisyntax for the Monastery