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

So I stole your test here for a moment...

say join "\n", grep { sprintf ("%03d",$_) + 0 ne ($_/1000)*1000 } 0..9 +9999

I needed to add a + 0 to be able to handle the trailing zero's. The funny thing is that in your case you would need to do the opposite ( "" . value) in case the value undergoes an arithmetic operation.

Replies are listed 'Best First'.
Re^8: number comparison with a twist (updated)
by LanX (Saint) on Mar 03, 2020 at 00:55 UTC
    This boils down to two alternatives to compare two numeric scalars with a minimal* rounding tolerance

    DB<65> $num1 = '0019.90'; $num2 = '019.9' DB<66> p $num1+0 eq $num2+0 1 DB<67> p "$num1" == "$num2" 1 DB<68>

    Not sure which one is technically better.

    I find the second one more readable and easier to explain.

    edit

    Well there are edge cases when the scalar is not purely numeric... but that's too complicated.

    update

    FWIW: the eq form can be further simplified with a unary +:

    DB<109> printf "%.20f\n",$_ for $a,$b 2547200.00000000000000000000 2547199.99999999950000000000 DB<110> p +$a eq +$b # unary + 1 + DB<111> p $a == $b # doesn't work DB<112> p "$a" == "$b" # preferred variant 1

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

    *) should be noted that this can't help fixing accumulated rounding errors.