Sobes.tech
Middle

Proč může být porovnání float čísel nesprávné a jak s tím bojovat?

sobes.tech AI

Odpověď od AI

Porovnání čísel s plovoucí desetinnou čárkou (float) může být nesprávné kvůli vlastnostem jejich reprezentace v paměti. Čísla s plovoucí desetinnou čárkou jsou uložena ve formátu IEEE 754, který nemusí vždy přesně reprezentovat desetinné zlomky, což vede k zaokrouhlovacím chybám.

Například výraz 0.1 + 0.2 == 0.3 může vrátit false kvůli drobným nepřesnostem.

Pro řešení tohoto problému se obvykle porovnávají čísla s ohledem na malou delta (epsilon):

const epsilon = 1e-9
func floatEquals(a, b float64) bool {
    return math.Abs(a - b) < epsilon
}

Tímto způsobem se místo přímého porovnání a == b kontroluje, zda je rozdíl mezi čísly dostatečně malý, aby je bylo možné považovat za rovné. To pomáhá zabránit chybám spojeným s nepřesnou reprezentací čísel a s hromaděním chyb při výpočtech.