Python: с учетом float, возвращаемое число десятичных знаков [duplicate]

Старая запись, но может быть выполнена следующим образом:

  if (! function_exists ('strim')): function strim ($ str, $ charlist = "", $ option = 0  ) {$ return = '';  if (is_string ($ str)) {// Переводить HTML-объекты $ return = str_replace ("& amp; nbsp;", "", $ str);  $ return = strtr ($ return, array_flip (get_html_translation_table (HTML_ENTITIES, ENT_QUOTES)));  // Выберите триммер опций ($ option) {// Сбрасываем пробелы (и другие символы) из начала и конца строки по умолчанию: case 0: $ return = trim ($ return, $ charlist);  ломать;  // Сбрасываем пробелы (и другие символы) с начала строки case 1: $ return = ltrim ($ return, $ charlist);  ломать;  // Сбрасываем пробелы (и другие символы) из конца строки 2: $ return = rtrim ($ return, $ charlist);  ломать;  }} return $ return;  } endif;   

Стандартные функции trim () могут быть проблематичными, когда появляются объекты HTML. Вот почему я написал функцию «Super Trim», которая используется для решения этой проблемы, а также вы можете выбрать обрезку со стороны начала, конца или стенда строки.

33
задан Constantinius 1 June 2011 в 10:39
поделиться

8 ответов

Чтобы повторить то, что сказали другие (потому что я уже набрал его!), я даже не уверен, что такое значение имеет смысл в случае числа с плавающей запятой из-за разницы между десятичным и двоичным представление; часто число, представимое конечным числом десятичных цифр, будет иметь только двоичное представление с бесконечной цифрой.

В случае объекта decimal.Decimal вы можете получить экспоненту с помощью метода as_tuple , который возвращает именованный элемент с значком , цифры и экспоненты :

  & gt; & gt; & gt;  d = decimal.Decimal ('56 .4325 ') & gt; & gt; & gt; & gt; & gt; & gt;  d.as_tuple (). exponent -4 & gt; & gt; & gt; & gt;  d = decimal.Decimal ('56 .43256436 ') & gt; & gt; & gt; & gt; & gt;  d.as_tuple (). exponent -8  

Отрицание экспоненты - это число цифр после десятичной точки, если показатель не превышает 0 .

40
ответ дан senderle 16 August 2018 в 00:01
поделиться
  • 1
    Кстати, я попытался сделать экспонента выше 0, но я не смог. Я не уверен, что это когда-либо. Кто-нибудь знает, как эта сторона вещей работает? – senderle 31 May 2011 в 17:02
  • 2
    Кроме того, я запускаю древний Python; в 2.7 и выше, Объекты Decimal имеют метод класса from_float , который непосредственно преобразует float в Decimal объекты. – senderle 31 May 2011 в 17:06
  • 3
    Это отличается от моего Python (версия 3.2): decimal.Decimal (56.4325) дает Decimal ('56 .43249999999999744204615126363933086395263671875 ') и as_tuple (). Exponent returns -47 – Alexander 31 May 2011 в 17:07
  • 4
    @Alexander, попробуйте это как строку. :) – senderle 31 May 2011 в 17:12
  • 5
    @BrianFisher, увидел это и вспомнил наше обсуждение - думал, что вы, возможно, захотите узнать. exponent does иногда идет выше нуля: decimal.Decimal (500) .normalize (). as_tuple (). exponent == 2 – senderle 27 June 2012 в 23:54

«число десятичных знаков» на самом деле не является свойством числа с плавающей запятой из-за того, как они хранятся и обрабатываются внутри страны. Вы можете получить столько знаков после запятой, сколько хотите, из числа с плавающей запятой. Вопрос в том, насколько точно вы хотите. При преобразовании числа с плавающей точкой в ​​строку часть процесса принимает решение о точности.

Попробуйте, например:

  1.1 - int (1.1)  

И вы увидите, что ответ:

  0.10000000000000009  

Итак, для этого случая число десятичных знаков равно 17. Это номер, который вы хотите?

Наверное, нет.

Вы можете, однако, округлить число до определенного числа десятичных знаков с помощью «round»:

  round (3.1415 - int (3.1415), 3)  

Для этого случая число десятичных дробей разрезается на 3.

t получить «количество десятичных знаков от поплавка», но вы можете определить точность и сколько хотите. Преобразование float в строку является одним из способов принятия такого решения.

9
ответ дан Alexander 16 August 2018 в 00:01
поделиться
  • 1
    Это отличный пост, поскольку он указывает, что мои вопросы были неправильными. Но, к сожалению, это не помогает мне с моей проблемой. (+1) – Constantinius 31 May 2011 в 16:56
  • 2
    +1, поскольку вы делаете здесь хорошие моменты – Mike Pennington 31 May 2011 в 17:07

Самый быстрый способ, которым я нашел для вычисления цифр после десятичной точки и округления числа, -

Вычисление цифр:

  a = decimal.Decimal ('56 .9554362669143476 ');  lenstr = len (str (a) .split (".") [1])  

Calc, check and rounding:

  a = decimal.  Десятичный ('56 0,9554362669143476' );  a = round (float (a), 5) если len (str (a) .split (".") [1]) & gt;  5 else float (a)  

Сравнение:

  $ python2 -mtimeit 'import decimal;  а = decimal.Decimal ('56 0,9554362669143476' );  round (float (a), 5) если a.as_tuple (). exponent & lt;  -5 else float (a) '10000 циклов, лучше всего 3: 32,4 usec за цикл $ python -mtimeit' import decimal;  а = decimal.Decimal ('56 0,9554362669143476' );  a = round (float (a), 5) если len (str (a) .split (".") [1]) & gt;  5 else float (a) '100000 циклов, лучше всего 3: 16,7 мксек за цикл  
1
ответ дан George 16 August 2018 в 00:01
поделиться

Мне нужно было что-то вроде этого, и я проверил некоторые из них, самый быстрый из которых я узнал:

  str (число) [:: - 1] .find ('.') [  ! d1] 

Из-за проблемы с плавающей запятой все модульные дали мне ложные результаты даже с Decimal (number) (обратите внимание, что мне это нужно в скрипте, чтобы фиксировать цены всего db)

  len (str (Десятичная (str (число)))% Десятичная (1))) - 2  

Необходимость поместить строку в десятичную строку довольно непростая когда у нас есть плавающие или что-то вроде.

Вот моя «скамья»: https://repl.it/FM8m/17

0
ответ дан Jérémy JOKE 16 August 2018 в 00:01
поделиться

Если вы знаете, что у вас не будут проблемы с синтаксическим разбором (или если вы позволяете самому питону или какой-либо другой библиотеке справляться с этим, надеемся, что вы будете решать проблемы с локализацией) ... просто проанализируйте его и используйте modf . Возвращаемое значение представляет собой пару значений, одна из которых является неотъемлемой частью, другая - дробной частью.

1
ответ дан jkerian 16 August 2018 в 00:01
поделиться
  • 1
    Это интересно, но в моем случае это не полезно, так как у меня все еще есть float , из которого я не могу получить число десятичных цифр. – Constantinius 31 May 2011 в 17:05

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

1
ответ дан Mark Ransom 16 August 2018 в 00:01
поделиться

Наивный способ (уязвим для локального использования, упомянутый @jglouie):

  len (foo.split ('.') [1])  

, где foo - строка типа «23.512999238».

EDIT

Как отметил @Thomas Jung и @Mark Ransom, это довольно наивно для некоторых угловых случаев, которые должны быть обрабатывается как ...

  import re from locale import localeconv dec_pt = localeconv () ['decimal_point'] decrgx = re.compile ("\ d + (% s \ d +)? e (-  | \ +) (\ d +) "% dec_pt), если decrgx.search (foo): # все еще выясняет, что это повышает значение NotImplementedError,« нотация не реализована »else: digits = len (foo.split (dec_pt) [- 1]  )  
7
ответ дан Mike Pennington 16 August 2018 в 00:01
поделиться
  • 1
    Как я уже упоминал, я просил менее «наивного» решения. Но +1 во всяком случае, так как ваше решение было лучше, чем мои неуклюжие попытки подсчитать цифры. – Constantinius 31 May 2011 в 16:42
  • 2
    Не работает для моего номера 1e-110 . – Thomas Jung 31 May 2011 в 16:47
  • 3
    @Constantinius, если у вас есть определенное обстоятельство, когда это ломается, возможно, мы сможем что-то выработать ... но я не знаю конкретной библиотеки для решения этой проблемы – Mike Pennington 31 May 2011 в 16:53
  • 4
    @Thomas Jung, спасибо, что указали это ... Я все еще думаю о том, какое правильное решение оно – Mike Pennington 31 May 2011 в 17:03
  • 5
    Вам необходимо обработать 1.0001e + 110 , а также 1e-110 . Вы должны разделить на locale.localeconv () ['decimal_point'] вместо '.' , чтобы быть действительно надежными. – Mark Ransom 31 May 2011 в 23:14

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

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

Лучше всего сделать ставку на точку в вашей строке и подсчитать количество символов в полученной подстроке.

4
ответ дан Spencer Rathbun 16 August 2018 в 00:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: