Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
PerlMonks  

decimal calculation

by bestfa (Novice)
on Mar 11, 2016 at 07:27 UTC ( [id://1157391]=perlquestion: print w/replies, xml ) Need Help??

bestfa has asked for the wisdom of the Perl Monks concerning the following question:

I coded a script to print from 0.01 to 7.99.

$j=0; for($i=0;$i<799;$i++) { $j=$j+0.01; print $WF1 "$j\t"; }

Strangely, I got results like

0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18 0.19 0.2 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 0.3 0.31 0.32 0.33 0.34 0.35 0.36 0.37 0.38 0.39 0.4 0.41 0.42 0.43 0.44 0.45 0.46 0.47 0.48 0.49 0.5 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 0.6 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.7 0.71 0.72 0.73 0.74 0.75 0.76 0.77 0.78 0.79 0.8 0.810000000000001 0.820000000000001 0.830000000000001 0.840000000000001 0.850000000000001 0.860000000000001 0.870000000000001 0.880000000000001 0.890000000000001 0.900000000000001 0.910000000000001 0.920000000000001 0.930000000000001 0.940000000000001 0.950000000000001 0.960000000000001 0.970000000000001 0.980000000000001 0.990000000000001 1 1.01 1.02 1.03 1.04 1.05 1.06 1.07 1.08 1.09 1.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.18 1.19 1.2 1.21 1.22 1.23 1.24 1.25 1.26 1.27 1.28 1.29 1.3 1.31 1.32 1.33 1.34 1.35 1.36 1.37 1.38 1.39 1.4 1.41 1.42 1.43 1.44 1.45 1.46 1.47 1.48 1.49 1.5 1.51 1.52 1.53 1.54 1.55 1.56 1.57 1.58

Why did I get 0.810000000000001? Thank you for many replies. I should study them when I am free.

Replies are listed 'Best First'.
Re: decimal calculation
by Ratazong (Monsignor) on Mar 11, 2016 at 07:40 UTC
      Thank you for your reply. I should study it when I am free. Thanks again.
Re: decimal calculation
by Marshall (Canon) on Mar 11, 2016 at 08:33 UTC
    possible alternate code using printf() to round off the imprecision with a power of 10 in fractional base 2 math.
    #!usr/bin/perl use strict; use warnings; my $j=0; for (1..800) #loop 800 times { $j+= 0.01; printf ("%0.2f\t", $j); #2 decimal places } __END__ Output: 0.01 0.02 0.03 0.04 0.05 0.06 ...... 7.95 7.96 7.97 7.98 7.99 8.00 Process completed successfully
Re: decimal calculation
by Athanasius (Archbishop) on Mar 11, 2016 at 09:27 UTC

    Hello bestfa,

    In the spirit of TMTOWTDI, here’s an approach that avoids the difficulties of floating point numbers by using only integers:

    #! perl use strict; use warnings; for my $i (1 .. 799) { $i = sprintf "%03d", $i; $i =~ s{(\d)(\d{2})}{$1.$2}; print "$i\t"; }

    Output:

    19:22 >perl 1570_SoPW.pl 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 + 0.10 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18 0.19 + 0.20 ... 7.81 7.82 7.83 7.84 7.85 7.86 7.87 7.88 7.89 + 7.90 7.91 7.92 7.93 7.94 7.95 7.96 7.97 7.98 7.99 19:22 >

    Hope that helps,

    Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

Re: decimal calculation
by syphilis (Archbishop) on Mar 11, 2016 at 07:46 UTC
    See:
    perldoc -q decimal perldoc perlnumber
    Cheers,
    Rob
Re: decimal calculation
by KurtSchwind (Chaplain) on Mar 11, 2016 at 14:52 UTC

    I see you already have some nice answers to your question.

    It appears that you are working with monetary units. This is something I work with often. The answer is nearly ALWAYS to work in 'cents' so that you can keep everything in an integer format and then just modify your presentation layer to add the decimal place where you want it. I'm sure that the FAQ linked will say something similar.

    --
    “For the Present is the point at which time touches eternity.” - CS Lewis

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others learning in the Monastery: (6)
As of 2024-04-23 06:47 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found