Sobes.tech
Middle
33

Почему сравнение float чисел может быть некорректным и как с этим бороться?

Companies where asked
СБЕРСБЕР

Answer from AI

sobes.tech AI

Сравнение чисел с плавающей точкой (float) может быть некорректным из-за особенностей их представления в памяти. Числа с плавающей точкой хранятся в формате IEEE 754, который не всегда может точно представить десятичные дроби, что приводит к ошибкам округления.

Например, выражение 0.1 + 0.2 == 0.3 может вернуть false из-за небольших погрешностей.

Чтобы бороться с этой проблемой, обычно сравнивают числа с учётом некоторой малой дельты (эпсилон):

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

Таким образом, вместо прямого сравнения a == b проверяется, что разница между числами достаточно мала, чтобы считать их равными. Это помогает избежать ошибок, связанных с неточным представлением чисел и накоплением погрешностей в вычислениях.