go-humanize icon indicating copy to clipboard operation
go-humanize copied to clipboard

Bytes returns 32 MB for 31450000 bytes instead of 31 MB

Open ravibitsgoa opened this issue 3 years ago • 2 comments

Sample program

package main

import (
	"fmt"
	"github.com/dustin/go-humanize"
)

func main() {
	fmt.Println(humanize.Bytes(31350000))
	fmt.Println(humanize.Bytes(31450000))
}

Current output

The above program, compiled with the latest main branch prints 31 MB and 32 MB.

Expected output

The result should be 31 MB for both calls. This is because 31.45 is less than 31.5. Hence, should be rounded down. This could be happening because of rounding errors in floating points.

Also, as a side note, the default rounding behaviour of the Bytes function is not documented properly.

ravibitsgoa avatar Apr 05 '22 13:04 ravibitsgoa

Yeah, that makes sense. It's a floor as it goes up in magnitude, so it wouldn't use a rounding rule like you expect. I'm not sure there's a best way. It's easy to argue for any of floor, ceiling, or the many rounding variations.

dustin avatar Apr 06 '22 04:04 dustin

If I understood correctly, we should use floor, right? So humanize.Bytes(31450000) should be 31 MB right? Shall I raise a PR to fix this bug?

ravibitsgoa avatar Apr 06 '22 07:04 ravibitsgoa