Go言語(Golang) 桁数指定できる Round(四捨五入)/RoundUp(切り上げ)/RoundDown(切り捨て)

開発Divの藤原です。

Go言語の標準関数にはエクセルのような桁数指定できる Round(四捨五入)/RoundUp(切り上げ)/RoundDown(切り捨て) 関数がありませんので、実装してみました。

今回気を付けたのは、マイナス値(負数)の扱いです。マイナス値もエクセルと同じようにプラス値(正数)の符号を反転させただけの結果になるようにしました。

 

実装はこちらです。

// Round 四捨五入
func Round(num, places float64) float64 {
    shift := math.Pow(10, places)
    return roundInt(num*shift) / shift
}

// RoundUp 切り上げ
func RoundUp(num, places float64) float64 {
    shift := math.Pow(10, places)
    return roundUpInt(num*shift) / shift
}

// RoundDown 切り捨て
func RoundDown(num, places float64) float64 {
    shift := math.Pow(10, places)
    return math.Trunc(num*shift) / shift
}

// roundInt 四捨五入(整数)
func roundInt(num float64) float64 {
    t := math.Trunc(num)
    if math.Abs(num-t) >= 0.5 {
        return t + math.Copysign(1, num)
    }
    return t
}

// roundInt 切り上げ(整数)
func roundUpInt(num float64) float64 {
    t := math.Trunc(num)
    return t + math.Copysign(1, num)
}

 

試験してみました。

https://play.golang.org/p/nkn_ENFOGbx

期待通りの動きになっています。