При работе с вещественными числами, или числами с плавающей запятой, могут быть несоответствия при сравнении двух значений, что кажутся одинаковыми. В отличие от целых чисел, IEEE вещественные значения являются «приблизительными». Необходимость конвертации чисел в подходящую для хранения в памяти компьютера форму приводит к небольшим неточностям вследствие округления. К примеру, значение 1.3 может быть представлено в виде 1.29999999999. Сравнение может осуществляться с допустимым отклонением. Для сравнения чисел с произвольной точностью нужен пакет big.

Как сравнить вещественные числа float в Go?

1. Создайте файл tolerance.go со следующим содержимым:

Форум Гоферов

Мы работаем над форумом для программистов на Golang. Очень нужны модераторы которые хотят помочь с ответами для новичков и помочь в развитии Go-сообщества.

Go на Форум

Уроки, статьи и Видео

Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.

Go в ВК Go в Telegram

2. Запустите код в терминале через go run tolerance.go;
3. Посмотрите на вывод:

4. Создайте файл big.go со следующим содержимым:

5. Запустите код в терминале через go run big.go;
6. Посмотрите на вывод:

Функции для сравнивания Float между собой в Golang

Первый способ сравнения вещественных чисел без использования встроенных пакетов (шаги 1-5) требует задействования так называемой константы EPSILON. Это небольшое значение разницы (дельты) между числами, что позволит считать их равными. Константа может быть со значением около 1е-8, чего достаточно для определения точности.

Второй вариант не только более сложный, но и более полезный для дальнейшей работы с вещественными числами. Пакет math/big предлагает тип Float, что можно настроить для данной точности. Преимущество данного пакета в том, что точность здесь может быть выше, нежели точность типа float64. По этой причине значения небольшой точности использовались для примера округления и сравнения данной точности.

Обратите внимание, что числа da и db равны при использовании 16-битной точности, но не равны при использовании 32-битной точности. Максимальную настраиваемую точность можно получить из константы big.MaxPrec.