in reply to Re^2: number comparison with a twist
in thread number comparison with a twist

$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.

Replies are listed 'Best First'.
Re^4: number comparison with a twist
by LanX (Saint) on Mar 02, 2020 at 17:15 UTC
    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

      I understand that the internal representation is (probably) floating point. However that is still an assumption of what the internal representation "decimal string" actually is. My point is that using the eq operator targets "decimal string" which has a lower precision (for DWIM reasons?), so you are absolutely right that that method smoothes the rounding errors from floats away

      printf "%.20f",$var

      This targeted floating point with high precision.

      This is what I (presumably) hope to target with the eq:

      printf "%.11f", $num2*100 ; # 1990.00000000000

      I'm not sure if $.11f now shows the exact correct number of decimals (which should be 15 I believe), but as far as I can see this solves OP's problem and that is why I suggested it. Just using eq is in my opinion fine for this particular use case. For the rest floating point is always a pain in the... well, you know

        > My point is that using the eq operator targets "decimal string"

        Please see Re^3: number comparison with a twist and connected posts to why using == is far better here

        Using the small epsilon rounding of stringification is actually a good idea (and not much different to the diff solutions proposed by others) ...

        ... but one has to first prove that it always works for cents ( which I did)

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