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环境配置

手撸Golang 结构型设计模式 代理模式

聊聊dubbo-Go-proxy的client

Go1.4 bootstrap 源码安装新版Go

json序列化在Golang中的应用

归并排序

Go语言从入门到实战,带你拿下Golang的高效编程法

Golang并发编程是什么

Golang网络数据传输过程中的binary.read与unsafe.pointer指针强转分析

Golang的内存管理(下篇)

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




打赏

取消

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

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

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

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

评论

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