Golang四舍五入保留两位小数


本文摘自网络,作者,侵删。

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四舍五入保留两位小数

相关阅读 >>

Golang interface接口深入理解

一文搞懂 Go 超时控制

用 wasmedge 中的嵌入式 webassembly 函数扩展 Golang 应用程序

Go - Go build 各种系统下的可执行文件

web安全学习方法与职业介绍-1

有没有发现Go 1.17将允许切片转换为数组指针啦?

Golang 之 我被 for-range 循环进去了

手撸Golang etcd raft协议之3

详解Golang.org/x一键安装脚本

模块二 Go语言进阶技术-错误处理(上)

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...