Sobes.tech
Middle+

Hogyan lehet elkerülni a lebegőpontos problémát NUMERIC használata nélkül? Milyen alternatív megközelítés van az INT típussal?

sobes.tech MI

Válasz az MI-től

A lebegőpontos számok problémája a float vagy double típusokban a tizedes részt tartalmazó számok reprezentációjának korlátozott pontossága miatt merül fel. A kerekítési hibák elkerülése érdekében anélkül, hogy a NUMERIC típusát használnánk (amely pontos fixpontos aritmetikát biztosít), gyakran alkalmaznak egész típusokat (INT).

Az ötlet az, hogy az értékeket minimális egységekben tároljuk, például ahelyett, hogy 12,34-et tárolnánk, 1234-et (szorozva 100-zal). Így minden művelet egész számokkal történik, ami kizárja a float-ra jellemző kerekítési hibákat.

Példa Go nyelven:

package main
import "fmt"

func main() {
    // Pénz tárolása fillérben (egész szám)
    var priceCents int = 1234 // 12,34 rubel

    // Adjunk hozzá 0,66 rubelt (66 fillér)
    priceCents += 66

    fmt.Printf("Ár: %d.%02d rubel\n", priceCents/100, priceCents%100)
}

Ez a megközelítés széles körben alkalmazott pénzügyi alkalmazásokban, ahol fontos a pontosság és a kerekítési hibák hiánya.