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

相关阅读 >>

Go中控制并发的两种方式

[now]-Go的时间工具箱

Golang用什么编辑器

[译]Golang 1.8工具链改进

如何处理Golang返回值较多问题

Golang怎么给slice赋长度

Go 语言入门系列:数组的使用

Go-gin源码(一)

手撸Golang 基本数据结构与算法 图的最短路径 贝尔曼-福特算法

手撸Golang 基本数据结构与算法 队列

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




打赏

取消

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

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

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

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

评论

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