Golang四舍五入保留两位小数

我爱张智容 · · 146 次点击 · · 开始浏览    

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

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:我爱张智容

查看原文:Golang四舍五入保留两位小数

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:1006366459

146 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传