Golang处理小数四舍五入与不进行四舍五入的用法

package scripts_stroage

import (
    "fmt"
    "github.com/shopspring/decimal"
    "strconv"
    "testing"
)

// 保留2位小数 —— 带四舍五入
func TestT81(t *testing.T) {
    var userCoin int = 5678
    cashOrigin := float64(userCoin) / 10000
    fmt.Println("cashOrigin: ", cashOrigin) // 0.5678

    // TODO 这里四舍五入了!!!
    cashOriginStr := fmt.Sprintf("%.2f", cashOrigin)
    fmt.Println("cashOriginStr: ", cashOriginStr)

    cash, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", cashOrigin), 64)
    fmt.Println("cash: ", cash) // 0.57
}

// 保留2位小数 —— 不带四舍五入
func Test82(t *testing.T) {
    var userCoin int = 5678
    cashOrigin := float64(userCoin) / 10000
    fmt.Println("cashOrigin: ", cashOrigin) // 0.5678
    // 小数点后2位,RoundFloor不四舍五入~向上取整~~ Round方法四舍五入~~RoundUp方法不管面是否大于等于5都往前进一位~
    cash, _ := decimal.NewFromFloat(cashOrigin).RoundFloor(2).Float64()
    fmt.Println("cash: ", cash) // 0.56

}

~~~

package scripts_stroage

import (
    "fmt"
    "github.com/shopspring/decimal"
    "strconv"
    "testing"
)

// 资源A(int):容易获取、数值比较大、不可交易
// 资源B(float64):不容易获取、数值比较小、可交易~ 买一些高级别的游戏内物品~
// 资源A可以通过一定的汇率转换为资源B~
// 资源A转换为资源B的时候就会遇到四舍五入的问题~

const cashRatio = 10000

func TestT81(t *testing.T) {
    a := 5678
    // TODO 四舍五入的写法
    originB := float64(a) / cashRatio
    fmt.Println("originB: ", originB) // originB:  0.5678
    // 只转小数点后2为,剩余位数忽略
    originBStr := fmt.Sprintf("%.2f", originB)
    fmt.Printf("originBStr: %v, %T \n", originBStr, originBStr) // originBStr: 0.57, string 
    ret, _ := strconv.ParseFloat(originBStr, 64)
    fmt.Printf("ret: %v, %T \n", ret, ret) // ret: 0.57, float64
}

func TestT82(t *testing.T) {
    a := 5678
    // github.com/shopspring/decimal
    originB := float64(a) / cashRatio // originB:  0.5678
    fmt.Println("originB: ", originB)
    // TODO 不四舍五入
    cashRet, _ := decimal.NewFromFloat(originB).RoundFloor(3).Float64()
    fmt.Printf("ret: %v, %T \n", cashRet, cashRet) // ret: 0.567, float64
}

~~~

posted on 2022-04-28 19:11  江湖乄夜雨  阅读(3863)  评论(1编辑  收藏  举报