2013-11-20 4 views
1

Почему python иногда расширяет числа и есть способ остановить его? Например, 1.7 может превратиться в 1.70000005. В частности, я сталкиваюсь с этим, беря в списке поплавки и пытаясь заполнить новый список.Python, продолжающий десятичные знаки

newList = [] 
for value in myList: 
    print value 
    newList.append(value) 
return newList 

Консоль распечатает номера, не содержащие более 2-х знаков после запятой, а NewList возвращается будет иметь 17 место, и часто включает в последней цифре ненулевой. Он делает это, даже если я пытаюсь округлить (значение, 2) внутри цикла.

+4

http://docs.python.org/2/tutorial/floatingpoint.html –

+0

Арифметика с плавающей точкой - бессердечная любовница :) –

+0

Если вам нужен точный контроль с плавающей запятой, используйте встроенный десятичный модуль: http: // docs.python.org/2/library/decimal.html –

ответ

1

Это просто представление! Фактически, содержимое списка остается тем же.

Чтобы показать это правильно, вы можете отформатировать его в виде строки:

print("{.17f}".format(my_float_value)) 

В качестве альтернативы, вы можете использовать модуль decimals:

>>> import decimal 
>>> my_float = decimal.Decimal("0.2342134235") 
>>> my_float 
Decimal('0.2342134235') 

Надеется, что это помогает!

1

CPython использует C-дублеты, а C-удваивает, как правило, для аппаратного обеспечения скорости.

Аппаратные средства с плавающей запятой точны только для ограниченного числа цифр. Кроме того, он хранит базу 2, и мы думаем, в основном, в базе 10, а некоторые числа, которые имеют конечное выражение в базе 10, не имеют одного в базе 2 и наоборот.

Таким образом, вы не должны:

  1. не сравнивайте значение с плавающей точкой для равенства в другую. Вместо этого вычтите их, возьмите абсолютное значение и сравните это значение , чтобы получить небольшое положительное число, например, 1e-8.
  2. Обозначьте значения с плавающей запятой до приемлемого количества мест после десятичной точки, используя форматирование строк или функцию http://docs.python.org/3/library/functions.html#round.

Вы можете использовать десятичный модуль, чтобы получить заданную точность. Или, если у вас есть рациональные значения, вы можете использовать модуль фракций.

+0

FYI Ваше утверждение «наоборот» неверно. Каждое базовое число 2 имеет конечное представление в базе 10, хотя количество требуемых цифр может быть удивительно большим - оно равно числу бит. –

Смежные вопросы