Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine
 
PerlMonks  

Re: Math::round not rounding correctly

by ikegami (Patriarch)
on Dec 23, 2014 at 20:44 UTC ( [id://1111233]=note: print w/replies, xml ) Need Help??


in reply to Math::round not rounding correctly

15/100 is a periodic number in binary, so it can't be stored accurately as a float.
____ 1.15 base10 = 1.001001 base2

This error causes 3010*1.15 to be equal to 3461.4999999999995, which Math::Round is correctly rounding to 3461.

You need to incorporate a tolerance. Since 1/2 can be stored precisely in a floating point number (0.510 = 0.12), you can use the following:

use feature qw( say ); use Math::Round qw( round ); my $x = 3010*1.15; say round($x); say round(round($x * 10**5) / 10**5); # 5 decimal places of precision
3461 3462

This is basically what tye did by stringifying the number, except he let Perl "choose" the factor.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1111233]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others chanting in the Monastery: (5)
As of 2024-03-29 05:35 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found