Перемещение точки вниз по числу с плавающей точкой - PullRequest
2 голосов
/ 28 марта 2011

Прежде всего, спасибо за внимание, я новичок в этом сайте ^^ так что извините, если я что-то не так делаю ...

У меня огромная проблема с моим кодом Python ... Я новичок в программировании, и я тоже новичок в Python.

Мне нужно взять число с плавающей запятой и переместить точку вправо, чтобы она стала целым числом, например 60,27 и 6027.

Используемый мной алгоритм рекурсивно умножает num*10 до num%2==0, а затем получает int(num).

Проблема в том, что когда я умножаю (например) 602.47*10, он возвращает 6024.700000000001 и, очевидно, не работает: -)

Есть ли способ исправить это, любой другой метод или другой способ сделать это рекурсивно? Мне разрешено использовать все, что мне нужно, но оно должно быть рекурсивным: нет for или while ...

Спасибо за помощь !! Мой родной язык не английский, поэтому я прошу прощения, если трудно читать ...

Ответы [ 6 ]

2 голосов
/ 28 марта 2011
>>> str(60.27).translate(None, '.')
'6027'

Используйте lstrip('0') для защиты от десятичных знаков ниже 1.


Из документов:

S.translate (table [, deletechars]) -> string

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

2 голосов
/ 28 марта 2011

Представления с плавающей точкой имеют эту проблему.

Вы хотите изменить:

1.2345
12.345
123.45
1234.5

все на 12345?

Для чисел с плавающей точкой, которые не имеют точного представления (выупомяните 6024.70), ожидаете ли вы получить 6024700000000001, так как это вывод ближайшего к 6024.70, который может быть сохранен в float?

1 голос
/ 28 марта 2011

Просто сделайте дикий удар в темноте, но означают ли ваши цифры суммы денег, которые вы пытаетесь конвертировать между (скажем) долларами и центами?Если это так, вам нужно прекратить то, что вы делаете, и конвертировать все в центы, и использовать только «долларовые» значения, когда фактически представляете вещи пользователю.Использование чисел с плавающей запятой для денежных значений - очень и очень плохая идея.

Если нет, игнорируйте меня: -)

1 голос
/ 28 марта 2011

Вы можете попробовать что-то вроде:

x = 60.27
newx = int(str(x).replace('.',''))

Редактировать: в качестве примечания, строки .replace и .translate имеют одинаковую производительность для поплавков различного размера

%timeit int(str(4.73285).replace('.',''))
100000 loops, best of 3: 2.65 us per loop

%timeit int(str(4.73285).translate(None, '.'))
100000 loops, best of 3: 3.02 us per loop
1 голос
/ 28 марта 2011

Поскольку вы не можете (надежно) использовать с плавающей запятой, чтобы делать то, что вы хотите, простой способ взломать это преобразовать число в строку, а затем вырвать десятичную точку:

int(str(num).replace('.',''))

Это будет работатьс любым числом, которое не представлено в научной записи.Если ваши числа достаточно велики (или малы), чтобы они в конечном итоге были представлены в научной записи, взгляните на this .

1 голос
/ 28 марта 2011

Было бы более надежным алгоритм просто анализировать число как строку и выполнять строковые манипуляции.Любой численный расчет с использованием чисел с плавающей точкой связан с неточностью, как вы уже видели.Обойти это невозможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...