開発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
期待通りの動きになっています。