strconv.Sprintf 格式化
Sprintf 四舍六入:
value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", 9.824), 64)
fmt.Println(value) //9.82
value, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", 9.826), 64)
fmt.Println(value) //9.83
第三位为5且5之后有有效数字,满足五入:
value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", 9.8251), 64)
fmt.Println(value) //9.83
value, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", 9.8351), 64)
fmt.Println(value) //9.84
第三位为5且5之后没有有效数字:
网上有人说,第二位为奇数则进位,第二位为偶数则舍去,例如:
value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", 9.825), 64)
fmt.Println(value) //9.82
value, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", 9.835), 64)
fmt.Println(value) //9.84
但是:
value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", 9.815), 64)
fmt.Println(value) //9.81 居然舍去了
value, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", 9.845), 64)
fmt.Println(value) //9.85 居然进位了
所以,如果想满足正常的四舍五入逻辑,最好不要使用Sprintf处理。
推荐使用如下:
package main
import (
"fmt"
"github.com/shopspring/decimal"
)
func main() {
v1, _ := decimal.NewFromFloat(9.824).Round(2).Float64()
v2, _ := decimal.NewFromFloat(9.826).Round(2).Float64()
v3, _ := decimal.NewFromFloat(9.8251).Round(2).Float64()
fmt.Println(v1, v2, v3)
v4, _ := decimal.NewFromFloat(9.815).Round(2).Float64()
v5, _ := decimal.NewFromFloat(9.825).Round(2).Float64()
v6, _ := decimal.NewFromFloat(9.835).Round(2).Float64()
v7, _ := decimal.NewFromFloat(9.845).Round(2).Float64()
fmt.Println(v4, v5, v6, v7)
v8, _ := decimal.NewFromFloat(3.3).Round(2).Float64()
v9, _ := decimal.NewFromFloat(3.3000000000000003).Round(2).Float64()
v10, _ := decimal.NewFromFloat(3).Round(2).Float64()
fmt.Println(v8, v9, v10)
v11, _ := decimal.NewFromFloat(129.975).Round(2).Float64()
v12, _ := decimal.NewFromFloat(34423.125).Round(2).Float64()
fmt.Println(v11, v12)
}
// 输出如下:
9.82 9.83 9.83
9.82 9.83 9.84 9.85
3.3 3.3 3
129.98 34423.13
有疑问加站长微信联系(非本文作者)