That is simply because you are using binary floating point (Float64 in Julia), instead of decimal floating point. There is a very nice package, DecFP.jl, (kudos to Steven Johnson, @stevengj on GitHub), that wraps the Intel decimal arithmetic library. You can do `Pkg.add("DecFP") ; using DecFP` (you may get a lot of deprecation warnings, esp. on v0.5, you can also do a `Pkg.checkout("DecFP") ; Pkg.build("DecFP")` to eliminate all but one warning on v0.5), and then you can do:
julia> a = d"0.2" +2E-1 julia> for i in 1:10 ; println(a * i) ; end +2E-1 +4E-1 +6E-1 +8E-1 +10E-1 +12E-1 +14E-1 +16E-1 +18E-1 +20E-1 The output is a bit funny, but the answers are exact, unlike most of the answers in the binary floating point case you showed. Note: the most heavily used language in the world (at least up to the early 2000s, I'm not sure what the stats would be like now), which was the 2nd ANSI standardized language, Cobol, originally only had decimal arithmetic (Modern Cobols also support IEEE binary floating point). A number of other heavily used (but not much talked about) languages, such as M/MUMPS, which happened to be the 3rd language standardized by ANSI, even before ANSI C. The most used version of M/MUMPS these days is Caché ObjectScript - which adds many things, including objects and IEEE binary floats. The Pick/MultiValue family of database languages also use decimal floating point. There is now the IEEE 754-2008 standard for decimal floating point, which the DecFP.jl package conforms to (implementing 3 of the formats - there are some more formats which I'm trying to write a package for, which are also implemented in hardware on IBM POWER architecture processors). There are a number of cases where it really is better to use decimal arithmetic, in order to not get in trouble with the tax man! (Lots of currency operations have this same issue) Here's a real simple example: you have a store, where you sell something for 70 cents, and there is a 5% sales tax. How much do tax to you charge the customer? *julia>tax = * > *.7 * 0.05* > *0.034999999999999996**julia> * > *round(tax,2)* > *0.03**julia> tax = * > *d".70" * d"0.05"* > *+350E-4**julia> * > *round(tax,2)**+4E-2* As you can see, with binary floating point, you get the wrong answer (0.03), but with decimal floating point, you get the correct answer (the one the tax authorities will want you to give them). Depending on your particular use case, you can either use the default IEEE binary floating point numbers in Julia, or the DecFP.jl package. Scott On Monday, December 28, 2015 at 4:59:24 AM UTC-5, Yonghee Kim wrote: > > I wrote simple code like this > > ---------------------- > a = 0.2 > > for i in 1:10 > println(a * i) > end > --------------------------- > > > and what I got is not 0.2, 0.4, 0.6, 0.8, 1.0 .... > > but this. > > 0.2 > 0.4 > 0.6000000000000001 > 0.8 > 1.0 > 1.2000000000000002 > 1.4000000000000001 > 1.6 > 1.8 > 2.0 > > > > println(0.2 * 3) does the same thing. not 0.6 but 0.6000000000000001 > > does anyone know why this happens? > >