note syphilis Hi, <br><br><I># In JavaScript, you can store 3335.9999999999995 which has 17 significant digits</I><br><br> Perl will actually store that number correctly, as this indicates: <c> C:\>perl -le "print 'ok' if 3335.9999999999995 > 3335.999999999999;" ok </c> The problem is that when perl prints these numbers out it first rounds them to 15 digits - hence perl prints out the same figure for each of the 2 values featured in the above one-liner, even though perl knows that the 2 values are different: <c> C:\>perl -le "print 3335.9999999999995; print 3335.999999999999;" 3336 3336 </c> <I># In JavaScript, if you try to add 3335.9999999999995 + 0.0000000000001, it is equal to 3335.9999999999995</I><br><br> Same goes for perl: <c> C:>perl -le "print 'ok' if 3335.9999999999995 + 0.0000000000001 == 3335.9999999999995;" ok </c> Again, the problem is perl's commitment to outputting an approximation: <c> C:\>perl -le "print 3335.9999999999995;" 3336 </c> <I># "print" won't display the last significant digit </I><br><br> Yes - annoying, isn't it. Simplest way to see what a floating point value actually is, is to either: <c> printf "%a", \$float; or printf "%.16e", \$float; </c> If you want to go to the trouble of installing Math::MPFR (which requires gmp and mpfr C libraries), I've just added an nvtoa() function which will return a string representation of an NV using as few digits as are necessary. (The nvtoa function requires mpfr-4.0.0 or later.) <br>For example: <c> C:\>perl -MMath::MPFR=":mpfr" -le "print nvtoa(2 ** -1074);" 5e-324 C:\>perl -MMath::MPFR=":mpfr" -le "print nvtoa(sqrt 2.0);" 1.4142135623730951 </c> Works with __float128 and long double builds, too - though Math-MPFR-4.09 (latest CPAN release) is somewhat slower than it ought to be for these nvtypes when abs(exponent) > about 500. <br>(This has been addressed in the current [https://github.com/sisyphus/math-mpfr|github version].) <br><br>If you're using perl-5.28.x or earlier, then you also need to be aware that perl often assigns slightly incorrect values. (This is fixed in perl-5.29.4 and later, so long as \$Config{d_strtod} is defined.) <br>If you want to be assured that a value is assigned correctly on perl-5.28 and earlier, simplest way might be (untested) to assign that value as a string provided to POSIX::strtod. <br>That is do: <c> use POSIX qw(strtod); \$x = strtod('1234e-5'); </c> instead of : <c> \$x = 1234e-5; </c> Or, you can also use Math::MPFR: <c> use Math::MPFR qw(:mpfr); \$x = atonv('1234e-5'); </c> <I># So, in order to get the same result you would get in JavaScript, you would call FMOD() function (see below) instead of using the % (mod) operator</I><br><br> I think this could be just 2 different languages making different choices regarding behaviour of the modulus operator when applied to fractional values. <br>Someone else might be able to provide more definitive advice about that. <br><br>Cheers<br>Rob 1168204 1229752