Dear Peter, Thanks for the reference!
All the best, Jochen On Wednesday, 13 August 2025 at 14:10:50 UTC+1 Peter Weinberger (温博格) wrote: > The canonical reference on this is by Guy Steele, "How to Print > Floating Point Numbers Accurately" > > On Wed, Aug 13, 2025 at 9:07 AM 'Alexander Ertli' via golang-nuts > <golan...@googlegroups.com> wrote: > > > > Hi Jochen, > > > > I think it's possible with a trick. > > > > My first naive thought on how to solve this is to simply shift the > decimal point over, do the rounding on the whole number, and then shift it > back. > > > > import "math" > > // Round performs rounding by shifting the decimal, rounding, and > shifting back. > > func Round(x float64, digits int) float64 { > > scale := math.Pow(10, float64(digits)) > > return math.Round(x*scale) / scale > > } > > > > https://go.dev/play/p/_DVsD45FAKb > > > > > > Am Mi., 13. Aug. 2025 um 14:51 Uhr schrieb robert engels < > ren...@ix.netcom.com>: > >> > >> Read up on numerical analysis - what you are asking for is impossible :) > >> > >> You need to convert to a string, or use BCD/fixed place values - like > github.com/robaho/fixed > >> > >> On Aug 13, 2025, at 7:42 AM, Jochen Voss <joche...@gmail.com> wrote: > >> > >> Dear all, > >> > >> I would like to define a function "func Round(x float64, digits int) > float64" which rounds to the given number of digits, in the sense that I > want "strconv.FormatFloat(x, 'f', -1, 64)" to show at most the given number > of digits after the decimal point. > >> > >> The following naive approach does not work: > >> > >> func Round(x float64, digits int) float64 { > >> eps := math.Pow10(-digits) > >> return math.Round(x/eps) * eps > >> } > >> > >> For example for rounding math.Pi to five digits I get > "3.1415900000000003" instead of "3.14159". > https://go.dev/play/p/gRtHG6ZgTjj . > >> > >> Anthropic's Claude suggested the following: > >> > >> func Round(x float64, digits int) float64 { > >> if digits <= 0 { > >> pow := math.Pow10(-digits) > >> return math.Round(x/pow) * pow > >> } > >> > >> format := "%." + strconv.Itoa(digits) + "f" > >> s := fmt.Sprintf(format, x) > >> result, _ := strconv.ParseFloat(s, 64) > >> > >> return result > >> } > >> > >> This seems to work, but also seems quite inefficient. > >> > >> Is there a better way? > >> > >> All the best, > >> Jochen > >> > >> PS.: Here is some testing code for experimenting > https://go.dev/play/p/Xcd6fTvYend > >> > >> > >> > >> -- > >> 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...@googlegroups.com. > >> To view this discussion visit > https://groups.google.com/d/msgid/golang-nuts/7d3ccdd4-d88b-4eba-8a36-02b51b7751e1n%40googlegroups.com > . > >> > >> > >> -- > >> 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...@googlegroups.com. > >> To view this discussion visit > https://groups.google.com/d/msgid/golang-nuts/234384D7-17A3-45B3-959C-8CE0D3F44BF5%40ix.netcom.com > . > > > > -- > > 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...@googlegroups.com. > > To view this discussion visit > https://groups.google.com/d/msgid/golang-nuts/CAC4E5Zk1bq7z%2B%2BePzBRnsCoEYWsAW0RJzAd6KvjqNeJyRayDOQ%40mail.gmail.com > . > -- 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 visit https://groups.google.com/d/msgid/golang-nuts/2d70ae83-c71c-4cba-810e-5e0aa3f12189n%40googlegroups.com.