Округление от нуля
Используйте math.Round, чтобы вернуть ближайшее целое число, как float64, округляя связи от нуля.
fmt.Println(math.Round(-0.6)) // -1
fmt.Println(math.Round(-0.4)) // -0
fmt.Println(math.Round(0.4))  // 0
fmt.Println(math.Round(0.6))  // 1
Обратите внимание на особые случаи.
Round(±0) = ±0
Round(±Inf) = ±Inf
Round(NaN) = NaN
Округлить до четного числа
Используйте math.RoundToEven, чтобы вернуть ближайшее целое число, как float64, округляя связи до четного числа.
fmt.Println(math.RoundToEven(0.5)) // 0
fmt.Println(math.RoundToEven(1.5)) // 2
Преобразовать в тип int
Обратите внимание, что при преобразовании числа с плавающей точкой в тип int дробь отбрасывается (усечение до нуля).
fmt.Println(int64(1.9))  //  1
fmt.Println(int64(-1.9)) // -1
Предупреждение: если тип результата не может представлять значение, преобразование завершается успешно, но результат зависит от реализации.
До версии Go 1.10
Следующие реализации эквивалентны math.Round и math.RoundToEven, но менее эффективны.
// Round возвращает ближайшее целое число, 
// округляя связи от нуля.
func Round(x float64) float64 {
    t := math.Trunc(x)
    if math.Abs(x-t) >= 0.5 {
        return t + math.Copysign(1, x)
    }
    return t
}
// RoundToEven возвращает ближайшее целое число, 
// округляя связи до четного числа.
func RoundToEven(x float64) float64 {
    t := math.Trunc(x)
    odd := math.Remainder(t, 2) != 0
    if d := math.Abs(x - t); d > 0.5 || (d == 0.5 && odd) {
        return t + math.Copysign(1, x)
    }
    return t
}
Читайте также:
- Спецификация Go: логические, числовые, строковые типы
 - Преобразования между int, int64 и string в Golang
 - Преобразования в Golang
 

Комментариев нет:
Отправить комментарий