В python при сравнении вещественных чисел (с плавающей точкой) могут возникнуть такие казусы.
>>>0.1+0.1+0.1==0.3
>>>False
Сумма 0,1+0,1+0,1 не равна 0,3!
Причина в том, что 0,1 имеет основание 10, которое хранится в памяти в двоичном формате, а значит, преобразуется в 2 [в двоичном представлении - 0.0(0011)] 😊.
Если отобразить, как хранится в памяти число 0.1 с точностью до 22 знаков получим:
Поэтому при сложении получаем число больше 0,3.
Как это проверить?
x, y = (0.1).as_integer_ratio()
num = format(x / y, ".22f")
print(num)
Результат:
0,1000000000000000055511
Как правильно сравнить?
Для этого можно использовать пакеты math или numpy и функцию isclose():
import math
x = math.isclose(0.1+0.1+0.1, 0.3)
print(x)
Результат: True
Аналогично с NumPy.
import numpy as np
x = np.isclose(0.1+0.1+0.1, 0.3)
print(x)
Результат: True
#питон #python #pythonснуля #python3 #float #секреты #технологии