поплавков
Всегда помните, что числа с плавающей точкой имеют ограниченную точность. Если вы думаете об этом, то должно быть ограничением того, насколько точно вы представляете число, если вы ограничиваете память 32 или 64 битами (или любым другим числом).
в Python
Python предоставляет только один тип с плавающей точкой. Числа с плавающей запятой обычно реализуются с использованием 64-битных, но все же они могут быть 64-битными в одном двоичном Python, 32-битными в другом, так что вы не можете действительно полагаться на это (однако, см. Комментарий @Mark Dickinson ниже).
Давайте проверим это. Но учтите, что, поскольку Python не предоставляет альтернативы float32 и float64, мы будем использовать другую библиотеку numpy для предоставления нам этих типов и операций:
>>> n = 1.23456789012345678901234567890
>>> n
1.2345678901234567
>>> numpy.float64(n)
1.2345678901234567
>>> numpy.float32(n)
1.2345679
Здесь мы видим, что Python на моем компьютере обрабатывает переменную как float64. Это уже усекает число, которое мы ввели (потому что float64 может обрабатывать только такую точность).
Когда мы используем float32, точность еще больше уменьшается, и из-за усечения ближайшее число, которое мы можем представить, немного отличается.
Заключение
Разрешение с плавающей точкой ограничено. Кроме того, некоторые операции ведут себя по-разному в разных архитектурах.
Даже если вы используете постоянный размер с плавающей точкой, не все числа могут быть представлены, и операции будут приводить к ошибкам усечения.
Сравнение поплавка с другим поплавком должно выполняться с учетом возможной погрешности. Не используйте float_a == float_b
, вместо этого используйте abs(float_a - float_b) < error_margin
.
Полагаться на представления с плавающей точкой - это всегда плохая идея. Python иногда использует научную запись:
>>> a = 0.0000000001
>>> str(a)
'1e-10'
Вы можете получить последовательное приближение округления (т. Е. Использовать в именах файлов), но помните, что хранение и представление - это разные вещи. Этот другой поток может помочь вам: Ограничение числами до двух десятичных знаков
В общем, я бы не советовал использовать числа с плавающей точкой в именах файлов или в качестве любого другого вида идентификатора.
Широта / Долгота
числа float32 не имеют достаточной точности для представления 5-го и 6-го десятичных чисел в парах широта / долгота (в зависимости от того, имеет ли целая часть одну, две или три цифры).
Если вы хотите узнать, что на самом деле происходит, проверьте эту страницу и проверьте некоторые из своих номеров: https://www.h -schmidt.net / FloatConverter / IEEE754.html
Представление
Обратите внимание, что Python округляет значения с плавающей точкой при их представлении:
>>> lat = 123.456789
>>> "{0:.6f}".format(lat)
'123.456789'
>>> "{0:.5f}".format(lat)
'123.45679'
И, как указано выше, широта / долгота не могут быть правильно представлены с помощью float32 до 6-го знака после запятой, и, кроме того, усеченные значения с плавающей запятой округляются при представлении Python:
>>> lat = 123.456789
>>> lat
123.456789
>>> "{0:.5f}".format(numpy.float64(lat))
'123.45679'
>>> "{0:.5f}".format(numpy.float32(lat))
'123.45679'
>>> "{0:.6f}".format(numpy.float32(lat))
'123.456787'
Как видите, округленная версия этого числа с плавающей точкой 32 не соответствует исходному числу с 5-го знака после запятой. Но также делает округленную версию до 5-го десятичного числа числа float64.