Python получает наименее значащие цифры из числа с плавающей точкой (без использования строковых операций) - PullRequest
3 голосов
/ 12 апреля 2011

Предполагая, что у меня есть число с плавающей точкой 12345.6789, и я хочу получить шесть наименее значащих цифр (т.е. 45.6789) в виде целого числа (т.е. 456789), используя битовые операции в python (v. 2.6).сделать это?

Спасибо

PS Я не хочу использовать строковые операции, даже если было бы довольно просто: для любого числа с плавающей запятой f:

int(str(int(f * 1000))[-10:])

РЕДАКТИРОВАТЬ:Этот оригинальный вопрос не имеет смысла, как показано в комментариях внутри.Многие извинения ... вместо этого методы получения наименее значимых цифр без использования строк показаны ниже (с использованием целочисленных значений и модуля)

Ответы [ 3 ]

7 голосов
/ 12 апреля 2011
>>> a = 12345.6789
>>> b = int(a*10000)
>>> b
123456789
>>> c = b % 1000000
>>> c
456789

Но - ПОЧЕМУ ??

3 голосов
/ 12 апреля 2011

Для вашего строкового решения важно то, что алгоритм отображения с плавающей запятой изменился в python 2.7:

Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) 
>>> 12345.6789
12345.678900000001

Python 2.7.0+ (r27:82500, Sep 15 2010, 18:04:55) 
>>> 12345.6789
12345.6789

Независимо от того, используете ли вы одно или другое, возникает проблема, связанная с точным определением точности числа с плавающей запятой. Скажем, вашему алгоритму присвоено значение с плавающей запятой 1.23. Какая точность? Может быть, это было сохранено как 1.230, но это просто случилось с нулевой цифрой. Поэтому вы должны знать, сколько цифр после периода вы хотите сохранить.

Кроме того, битовые операции не работают с плавающей точкой:

>>> 12345.6789 << 4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for <<: 'float' and 'int'

Таким образом, вы должны умножить число с плавающей точкой на вашу известную точность и использовать по модулю (%), как это предлагается другими авторами.

3 голосов
/ 12 апреля 2011
>>> int(12345.6789*10000)%1000000
456789

но это не битовые операции

...