Как правильно работать с арифметикой с плавающей точкой в ​​Python? - PullRequest
1 голос
/ 04 апреля 2019

Как правильно сложить или вычесть используя поплавки? Например, как выполнить:

2.4e-07 - 1e-8

, чтобы он возвращал 2.3e-7 вместо 2.2999999999999997e-07.

Преобразование в int сначала приводит к неожиданным результатам, ниже возвращается 2.2e-07:

int(2.4e-07 * 1e8 - 1) * 1e-8

Аналогично,

(2.4e-07 * 1e8 - 1) * 1e-8

возвращает 2.2999999999999997e-07.

Как выполнить вычитание и сложение чисел с точностью до 8 десятичных знаков?

2.2999999999999997e-07 недостаточно, поскольку число используется для поиска в словаре, а ключ - 2.3e-7. Это означает, что любое значение, отличное от 2.3e-7, приводит к неправильному поиску.

Ответы [ 3 ]

1 голос
/ 04 апреля 2019

Я предлагаю использовать тип данных decimal (он присутствует в стандартной установке Python), потому что он использует фиксированную точность, чтобы избежать только тех различий, о которых вы говорите.

>>> from decimal import Decimal
>>> x = Decimal('2.4e-7')
>>> x
Decimal('2.4E-7')
>>> y = Decimal('1e-8')
>>> y
Decimal('1E-8')
>>> x - y
Decimal('2.3E-7')
1 голос
/ 04 апреля 2019

Это просто способ обойти проблему арифметики с плавающей запятой, но я предлагаю использовать пакет decimal из стандартной библиотеки.Это позволяет вам выполнять точную математику с плавающей точкой.

Используя ваш пример,

$ from decimal import Decimal
$ x = Decimal('2.4e-7')
$ y = Decimal('1e-8')
$ x-y
Decimal('2.3E-7')

Стоит отметить, что Decimal объекты отличаются от встроенных float, но онив основном взаимозаменяемы.

0 голосов
/ 04 апреля 2019

Я не знаю, если это то, что вы ищете, но вы можете попробовать такую ​​вещь:

a = 0.555555555
a = float("{0:.2f}".format(a))
>>> 0.56

Надеюсь, это вам поможет!

Adrien

...