Найти в Дзене
Секреты python

Секреты сравнения float - чисел в python

В 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 #секреты #технологии
Оглавление

В 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 #секреты #технологии