A floating point number cannot represent all possible real numbers - so when 
you “shift it back” the number you expect may not be possible.

See this on why 0.1 cannot be represented. 
https://how.dev/answers/why-does-01-not-exist-in-floating-point

> On Aug 13, 2025, at 7:55 AM, Jochen Voss <jochen.v...@gmail.com> wrote:
> 
> Dear Robert,
> 
> Thank you for your response.  To make sure I understand: Are you saying 
> Claude's Round() function does not work?  (For which example?)  Or are you 
> saying it is impossible to do better than Claude's function?
> 
> Many thanks,
> Jochen
> 
> On Wednesday, 13 August 2025 at 13:52:08 UTC+1 robert engels wrote:
>> 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 <http://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
>>>  
>>> <https://groups.google.com/d/msgid/golang-nuts/7d3ccdd4-d88b-4eba-8a36-02b51b7751e1n%40googlegroups.com?utm_medium=email&utm_source=footer>.
>> 
> 
> 
> -- 
> 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 
> <mailto:golang-nuts+unsubscr...@googlegroups.com>.
> To view this discussion visit 
> https://groups.google.com/d/msgid/golang-nuts/1e3872a4-6b05-4f03-9dd3-37d1b6955297n%40googlegroups.com
>  
> <https://groups.google.com/d/msgid/golang-nuts/1e3872a4-6b05-4f03-9dd3-37d1b6955297n%40googlegroups.com?utm_medium=email&utm_source=footer>.

-- 
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/1CCEDE74-345C-4E9F-97FB-87316AB45747%40ix.netcom.com.

Reply via email to