Great Tobias, You are a good teacher and I am honored to have your attention. OK I understand, never more extravagant mathematics. Thank you very much for your explanations
Regards Gianluigi P.S. You will not believe it but some tests with Floor and Ceil I did :-( 2017-07-13 20:00 GMT+02:00 Tobias Boege <tabo...@gmail.com>: > On Thu, 13 Jul 2017, Gianluigi wrote: > > I would not be misunderstood. > > I had understood that Alex wanted a forced increase "Round". > > > > To recap: > > > > Dim n As Float = 26.6601666666666 > > Dim b As Byte > > > > Print Int(n * 100) / 100 ' Normal truncate, as already > > mentioned by other > > Print Round(n, -2) ' Normal round, as already > > mentioned by other > > If Len(CStr(Frac(n))) > 4 Then > > b = Val(Mid(CStr(Frac(n)), 5, 1)) > > If b >= 5 Then > > Print Round(n, -2) > > Else > > Print Round(n + 0.01, -2) ' Forced increase round, as > > proposed by me > > Endif > > Endif > > > > I would avoid arithmetic operations involving even more floats, such as you > proposed. Consider this: > > $ gbx3 -e 'Round(0.80999999950+0.1,-9)' > 0.909999999 > $ gbx3 -e 'Round(0.80999999951+0.1,-9)' > 0.91 > > I only changed the very last digit (of order 10^-11) from 0 to 1 which > shouldn't influence the rouding to 9 decimals at all -- but it does! > > The problem here is, famously, that the decimal 0.1 has no finite binary > representation, so *storing* the value that is represented in decimal by > the string "0.1" in a binary float already gives you an unavoidable error. > Whenever you use 0.1 in your program, this error propagates. Specifically, > the error when storing 0.1 in a Single is about 1.49*10^-9, which is how > I arrived at that example above. > > Of course, the same applies to the 0.01 you use above. You can think > by yourself about a similar example where float addition with 0.01 makes > the result of a later rounding unreliable. > > The other method > > Floor(n*100)/100 ' round down to two decimals > Ceil(n*100)/100 ' round up to two decimals > > is reliable, since the *integer* 100 can be stored without error in a > float and IEEE754 requires the outcome of float arithmetic to be the > same as if the operation was performed exactly and then rounded to the > limited precision of the float datatype [1]. > > Regards, > Tobi > > [1] http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html#865 > > -- > "There's an old saying: Don't change anything... ever!" -- Mr. Monk > > ------------------------------------------------------------ > ------------------ > Check out the vibrant tech community on one of the world's most > engaging tech sites, Slashdot.org! http://sdm.link/slashdot > _______________________________________________ > Gambas-user mailing list > Gambas-user@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/gambas-user > ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Gambas-user mailing list Gambas-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/gambas-user