将float格式化为n个小数位并且不包含尾随零

Bla*_*ise 13 go floating-point-conversion

我想显示一个包含整个整数部分的浮点数和小数部分最多两位小数,不带尾随零.

http://play.golang.org/p/mAdQl6erWX:

// Desired output: 
// "1.9"
// "10.9"
// "100.9"

fmt.Println("2g:")
fmt.Println(fmt.Sprintf("%.2g", 1.900)) // outputs "1.9"
fmt.Println(fmt.Sprintf("%.2g", 10.900)) // outputs "11"
fmt.Println(fmt.Sprintf("%.2g", 100.900)) // outputs "1e+02"

fmt.Println("\n2f:")
fmt.Println(fmt.Sprintf("%.2f", 1.900)) // outputs "1.90"
fmt.Println(fmt.Sprintf("%.2f", 10.900)) // outputs "10.90"
fmt.Println(fmt.Sprintf("%.2f", 100.900)) // outputs "100.90"
Run Code Online (Sandbox Code Playgroud)

格式化具有2g当整数增加数量级时开始舍入的问题.此外,它有时会显示数字e.

格式化2f有问题,它将显示尾随零.我可以写一个删除尾随零的后处理函数,但我宁愿这样做Sprintf.

这可以通过一般方式使用Sprintf吗?
如果没有,有什么好办法呢?

小智 25

strconv.FormatFloat(10.900, 'f', -1, 64)

这将导致10.9.

-1作为第三个参数告诉函数来打印必要的位数以准确地表示浮最少.

请参见此处:https://golang.org/pkg/strconv/#FormatFloat

  • 这并不能严格解决他们的问题,因为他们想要 2 点的精度。 (6认同)

fer*_*mas 7

不确定Sprintf但要让它起作用。修剪正确,0然后.

fmt.Println(strings.TrimRight(strings.TrimRight(fmt.Sprintf("%.2f", 100.900), "0"), ".")) // 100.9
fmt.Println(strings.TrimRight(strings.TrimRight(fmt.Sprintf("%.2f", 100.0), "0"), ".")) // 100
Run Code Online (Sandbox Code Playgroud)


Ham*_*imi 6

我使用下面的函数来实现相同的效果:

//return 45.00 with "45" or 45.50 with "45.5"
func betterFormat(num float32) string {
    s := fmt.Sprintf("%.4f", num)
    return strings.TrimRight(strings.TrimRight(s, "0"), ".")
}
Run Code Online (Sandbox Code Playgroud)