math.Mod în Go

math.Mod și math.Remainder dau restul împărțirii pentru float64; math.Modf desparte un număr în parte întreagă și zecimală.

Sintaxă
import "math"

func Mod(x, y float64) float64
func Remainder(x, y float64) float64
func Modf(f float64) (int float64, frac float64)

Ce face math.Mod

Operatorul % din Go merge doar pe întregi. Pentru numere zecimale folosești math.Mod(x, y): restul are semnul lui x și este mai mic decât y în valoare absolută. math.Mod(7.5, 2) este 1.5, math.Mod(-7, 3) este -1.

math.Remainder(x, y) calculează restul după standardul IEEE 754: x - n*y, unde n este câtul rotunjit la cel mai apropiat întreg. De aceea rezultatul poate fi negativ chiar pentru numere pozitive: Remainder(8, 3) este -1 (8/3 ≈ 2.67 se rotunjește la 3).

math.Modf(f) returnează două valori: partea întreagă și partea zecimală, ambele cu semnul lui f. math.Modf(3.75) dă 3 și 0.75.

Parametri

Parametru Descriere
x, y Deîmpărțitul și împărțitorul. Dacă y este 0, rezultatul este NaN.
f Pentru Modf: numărul despărțit.

Ce returnează

Mod și Remainder: restul, ca float64. Modf: partea întreagă și partea zecimală.

Exemple

Exemplul 1: Mod față de Remainder

package main

import (
    "fmt"
    "math"
)

func main() {
    fmt.Println(math.Mod(7.5, 2))
    fmt.Println(math.Mod(-7, 3))
    fmt.Println(math.Remainder(7, 3))
    fmt.Println(math.Remainder(8, 3))
    fmt.Println(7 % 3, -7 % 3) // pentru întregi există operatorul %
}

Rezultat

1.5
-1
1
-1
1 -1

Exemplul 2: Ore și minute dintr-o durată zecimală

Modf separă orele întregi de fracțiunea de oră, pe care o transformi în minute.

package main

import (
    "fmt"
    "math"
)

func main() {
    durata := 2.75 // ore
    ore, fractiune := math.Modf(durata)
    fmt.Printf("%.0f ore și %.0f minute\n", ore, fractiune*60)

    intreg, zec := math.Modf(-3.25)
    fmt.Println(intreg, zec)
}

Rezultat

2 ore și 45 minute
-3 -0.25

Greșeli frecvente

  • Scrii 7.5 % 2: nu compilează, % nu este definit pentru float64. Folosește math.Mod.
  • Aștepți ca Remainder să fie mereu pozitiv: rezultatul este în intervalul [-y/2, y/2].

Comenzi înrudite

  • math.Floor: math.Floor rotunjește în jos, math.Ceil în sus, iar math.Trunc taie partea zecimală (spre zero).
  • math.Round: math.Round rotunjește la cel mai apropiat întreg (jumătățile se duc departe de zero); RoundToEven duce jumătățile la par.