На самом деле это два вопроса с разными ответами. 1: значения двойной точности в python являются числами с плавающей запятой, а 2: тип данных с более высокой точностью, чем float, будет десятичным. Можно ли как-то разделить подобные вопросы? Принятый ответ адресован # 2, но наиболее одобренный ответ адресов # 1.
В отличие от аппаратных двоичных чисел с плавающей запятой, десятичный модуль имеет настраиваемую пользователем точность (по умолчанию 28 разрядов), которая может быть настолько большой, насколько это необходимо для данной проблемы.
Если вас беспокоят проблемы с производительностью, обратите внимание на GMPY.
Если бы я задавал исходный вопрос, то ответом был бы @ larsmans (хотя формально это не по теме).
Петр Финдейзен,
@PiotrFindeisen где этот ответ?
PleaseHelp
Понятия не имею, но сейчас я бы обратился к @FredFoo. Обычно "Плавающие значения двойной точности в Python?" → « float-s имеют двойную точность»
Петр Финдейзен
120
Встроенный floatтип Python имеет двойную точность (это C doubleв CPython, Java doubleв Jython). Если вам нужна более высокая точность, получите NumPy и используйте его numpy.float128.
По-видимому, numpy.float128часто имеет 64-битную точность в 64-битной системе. numpy.float128(1) + numpy.float128(2**-64) - numpy.float128(1)возвращается 0.0. См. Stackoverflow.com/a/29821557/420755
Джефф,
0,1 + 0,2 не является точным 0,3 в python, на всех других языках это проблема с плавающей точкой, но никогда не двойная проблема. Почему в питоне не совсем 0,3?
Fusca Software
@FuscaSoftware Это проблема и на других языках. Двойники IEEE не могут точно представлять 0,3. Звучит как артефакт форматирования.
Ханс Масгрейв
17
Для некоторых приложений вы можете использовать Fractionвместо чисел с плавающей запятой.
>>> from fractions import Fraction
>>> Fraction(1, 3**54)
Fraction(1, 58149737003040059690390169)
(Для других приложений, decimalкак было предложено в других ответах.)
как выбрать между десятичной дробью и дробью? Дробь кажется лучше, поскольку она может представлять продолжающиеся дроби, которые, как я полагаю, не может быть десятичной?
Janus Troelsen
1
@Janus: рассмотрите свои требования и выберите тот, который им больше подходит. Используйте, Decimalесли вы хотите работать с приблизительными числами с фиксированной (но настраиваемой) точностью. Используйте, Fractionкогда вы хотите работать с точными пропорциями и готовы мириться с их неограниченными требованиями к хранению.
Гарет Рис,
Поддерживает ли Fraction все операции, которые вы можете делать с float?
danijar
14
Может быть вам нужен десятичный
>>> from decimal import Decimal
>>> Decimal(2.675)
Decimal('2.67499999999999982236431605997495353221893310546875')
Вот мое решение. Сначала я создаю случайные числа с помощью random.uniform, форматирую их в строку с двойной точностью, а затем конвертирую обратно в float. Вы можете настроить точность, изменив '.2f' на '.3f' и т. Д.
Хорошо. Двойная точность означает двоичное представление переменной двойной длины по сравнению с двоичным представлением float. Не два десятичных знака.
Кравемир
Ты прав. Я мог использовать плохие критерии поиска, когда сам сталкивался с этой проблемой, и вот результат. Некоторые другие могут искать эту же проблему, как и я, и оказаться здесь. Надеюсь, они найдут какое-то облегчение. :)
Bittikettu 02
Это худший способ округлить число с плавающей запятой до двух знаков после запятой. Вы должны как минимум использовать numpy.floor(100*a)/100для усечения числа aдо двух десятичных знаков.
Ответы:
Десятичный тип данных
Если вас беспокоят проблемы с производительностью, обратите внимание на GMPY.
источник
float
-s имеют двойную точность»Встроенный
float
тип Python имеет двойную точность (это Cdouble
в CPython, Javadouble
в Jython). Если вам нужна более высокая точность, получите NumPy и используйте егоnumpy.float128
.источник
numpy.float128
часто имеет 64-битную точность в 64-битной системе.numpy.float128(1) + numpy.float128(2**-64) - numpy.float128(1)
возвращается0.0
. См. Stackoverflow.com/a/29821557/420755Для некоторых приложений вы можете использовать
Fraction
вместо чисел с плавающей запятой.>>> from fractions import Fraction >>> Fraction(1, 3**54) Fraction(1, 58149737003040059690390169)
(Для других приложений,
decimal
как было предложено в других ответах.)источник
Decimal
если вы хотите работать с приблизительными числами с фиксированной (но настраиваемой) точностью. Используйте,Fraction
когда вы хотите работать с точными пропорциями и готовы мириться с их неограниченными требованиями к хранению.Может быть вам нужен десятичный
>>> from decimal import Decimal >>> Decimal(2.675) Decimal('2.67499999999999982236431605997495353221893310546875')
Арифметика с плавающей запятой
источник
Вот мое решение. Сначала я создаю случайные числа с помощью random.uniform, форматирую их в строку с двойной точностью, а затем конвертирую обратно в float. Вы можете настроить точность, изменив '.2f' на '.3f' и т. Д.
import random from decimal import Decimal GndSpeedHigh = float(format(Decimal(random.uniform(5, 25)), '.2f')) GndSpeedLow = float(format(Decimal(random.uniform(2, GndSpeedHigh)), '.2f')) GndSpeedMean = float(Decimal(format(GndSpeedHigh + GndSpeedLow) / 2, '.2f'))) print(GndSpeedMean)
источник
numpy.floor(100*a)/100
для усечения числаa
до двух десятичных знаков.