Я обнаружил самый простой способ использования выражений iQueryable при вызове метода с использованием отражения. См. Ниже код:
Вы можете использовать выражение IQueryable в соответствии с требованием.
var attributeName = "CarName";
var attributeValue = "Honda Accord";
carList.FirstOrDefault(e => e.GetType().GetProperty(attributeName).GetValue(e, null) as string== attributeValue);
Вы можете использовать отрицательные числа для округления целых чисел:
>>> 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.
.Отправленный ответ был наилучшим имеющимся при предоставлении, но он имеет много ограничений и не производит технически корректные значащие цифры.
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.
Я не могу придумать ничего, что могло бы справиться с этим из коробки. Но это довольно хорошо обрабатывается для чисел с плавающей запятой.
>>> 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)
Если вы хотите иметь отличную от 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
% 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'