вторник, 5 мая 2020 г.

Округление числа с плавающей точкой до целочисленного значения в Golang

Округление от нуля

Используйте 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
}


Читайте также:


Комментариев нет:

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