On Fri, 6 Dec 2019, at 9:25 AM, Christophe Meessen wrote: > I have noticed that printf performs an apparently inconsistent rounding of > floating point values. > > I divide a big number by 1000 and printf the resulting value with "%.1f". > Here is the code: https://play.golang.org/p/e7dD3c6IHq2
I think you are just seeing the usual problems of floating point representation. You may wonder why 999450/1000=999.45, 999500/1000=999.50 and 999550/1000=999.55 all format as 999.5. The answer is that the internal representation of the three results cannot correspond to the mathematical result you expect. This link shows the internal representation of each answer: https://play.golang.org/p/bBTNCdsAttR You can see that 999550/1000 = 999.549999999999954525264911353588104248046875 which is printed as 999.5 > I would expect the rounding rule to be "round away from zero" as defined > here: https://math.stackexchange.com/a/2252888/33796 > In this case 0.5 is rounded to 1 (or 0.05 to 0.1) and -0.5 to -1 (or -0.05 to > -0.1). The strconv and fmt packages use round to even as a rule. Use math.Round to round away from zero. -- Ian -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/ee94624c-5485-4daf-98ad-8e59055056dd%40www.fastmail.com.