Как к раунду число к значащим цифрам в Python

Я обнаружил самый простой способ использования выражений iQueryable при вызове метода с использованием отражения. См. Ниже код:

Вы можете использовать выражение IQueryable в соответствии с требованием.

var attributeName = "CarName";
var attributeValue = "Honda Accord";

carList.FirstOrDefault(e => e.GetType().GetProperty(attributeName).GetValue(e, null) as string== attributeValue);
128
задан Peter Graham 5 August 2010 в 02:37
поделиться

5 ответов

Вы можете использовать отрицательные числа для округления целых чисел:

>>> round(1234, -3)
1000.0

Таким образом, если вам нужна только старшая цифра:

>>> from math import log10, floor
>>> def round_to_1(x):
...   return round(x, -int(floor(log10(abs(x)))))
... 
>>> round_to_1(0.0232)
0.02
>>> round_to_1(1234243)
1000000.0
>>> round_to_1(13)
10.0
>>> round_to_1(4)
4.0
>>> round_to_1(19)
20.0

Вам, вероятно, придется позаботиться о преобразовании float в целое число, если оно больше 1.

.
134
ответ дан 24 November 2019 в 00:35
поделиться

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

numpy.format_float_positional поддерживает желаемое поведение непосредственно. Следующий фрагмент возвращает плавание x отформатированный к 4 значащим цифрам с подавленным экспоненциальным представлением.

import numpy as np
x=12345.6
np.format_float_positional(x, precision=4, unique=False, fractional=False, trim='k')
> 12340.
0
ответ дан 24 November 2019 в 00:35
поделиться

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

>>> round(1.2322, 2)
1.23

Целые числа сложнее. Они не хранятся в памяти с десятичным основанием, поэтому делать значимые места неестественно. Однако это довольно просто реализовать, если они являются строкой.

Или для целых чисел:

>>> def intround(n, sigfigs):
...   n = str(n)
...   return n[:sigfigs] + ('0' * (len(n)-(sigfigs)))

>>> intround(1234, 1)
'1000'
>>> intround(1234, 2)

Если вы хотите создать функцию, которая обрабатывает любые числа, я бы предпочел преобразовать их оба в строки и искать десятичный разряд, чтобы решить, что делать:

>>> def roundall1(n, sigfigs):
...   n = str(n)
...   try:
...     sigfigs = n.index('.')
...   except ValueError:
...     pass
...   return intround(n, sigfigs)

Другой вариант это проверить тип. Это будет гораздо менее гибким и, вероятно, не будет хорошо работать с другими числами, такими как Decimal объекты:

>>> def roundall2(n, sigfigs):
...   if type(n) is int: return intround(n, sigfigs)
...   else: return round(n, sigfigs)
2
ответ дан 24 November 2019 в 00:35
поделиться

Если вы хотите иметь отличную от 1 значащую десятичную дробь (в остальном то же, что и у Евгения):

>>> from math import log10, floor
>>> def round_sig(x, sig=2):
...   return round(x, sig-int(floor(log10(abs(x))))-1)
... 
>>> round_sig(0.0232)
0.023
>>> round_sig(0.0232, 1)
0.02
>>> round_sig(1234243, 3)
1230000.0
46
ответ дан 24 November 2019 в 00:35
поделиться

% g в строковом форматировании будет форматировать число с плавающей запятой, округленное до некоторого числа значащих цифр. Иногда он будет использовать научную нотацию 'e', ​​поэтому преобразуйте округленную строку обратно в число с плавающей запятой, а затем с помощью форматирования строки% s.

>>> '%s' % float('%.1g' % 1234)
'1000'
>>> '%s' % float('%.1g' % 0.12)
'0.1'
>>> '%s' % float('%.1g' % 0.012)
'0.01'
>>> '%s' % float('%.1g' % 0.062)
'0.06'
>>> '%s' % float('%.1g' % 6253)
'6000.0'
>>> '%s' % float('%.1g' % 1999)
'2000.0'
95
ответ дан 24 November 2019 в 00:35
поделиться
Другие вопросы по тегам:

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