Как сделать округление в математике / большой поплавок? - PullRequest
2 голосов
/ 23 марта 2020

У меня есть big.Float в golang стандартной math/big библиотеке, и я хочу округлить до ближайшего big.Int. Я не знаю как.

package main

import (
    "fmt"
    "math/big"
)

func main() {
    bfloat, _ := (&big.Float{}).SetString("1.8")

    // what to do here to round bfloat to nearest int?
    bint, _ := bfloat.Int(nil) // not this, this truncates

    fmt.Println(bint.String())
}

1 Ответ

1 голос
/ 23 марта 2020

Вы можете добавить 0.5 к нему перед вызовом Float.Int(), и вы получите то, что хотите.

По крайней мере, для положительных чисел. Если число отрицательное, вы должны добавить -0.5, например, -0.6 округляется до -1.0.

Вот как вы можете это сделать:

delta := 0.5
if bf.Sign() < 0 {
    delta = -0.5
}
bf.Add(bf, new(big.Float).SetFloat64(delta))
bint, _ := bf.Int(nil)

Вы можете упростить это дополнение следующим образом, если хотите:

bf.Add(bf, new(big.Float).SetFloat64(0.5*float64(bf.Sign())))

Давайте проверим его на некоторые значения:

for _, s := range []string{"-0.8", "-0.3", "0.6", "1.1", "1.8"} {
    bf, _ := (&big.Float{}).SetString(s)

    delta := 0.5
    if bf.Sign() < 0 {
        delta = -0.5
    }
    bf.Add(bf, new(big.Float).SetFloat64(delta))
    bint, _ := bf.Int(nil)

    fmt.Printf("%5s => %2s\n", s, bint)
}

Вывод (попробуйте на игровой площадке Go ):

 -0.8 => -1
 -0.3 =>  0
  0.6 =>  1
  1.1 =>  1
  1.8 =>  2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...