Итак, это прекрасно работает:
>>> float(1.0e-1)
0.10000000000000001
Но при работе с большим числом он не будет печатать:
>>> float(1.0e-9)
1.0000000000000001e-09
Есть ли способ заставить это? Возможно, используя numpy или что-то в этом роде.
Итак, это прекрасно работает:
>>> float(1.0e-1)
0.10000000000000001
Но при работе с большим числом он не будет печатать:
>>> float(1.0e-9)
1.0000000000000001e-09
Есть ли способ заставить это? Возможно, используя numpy или что-то в этом роде.
print '{0:.10f}'.format(1.0e-9)
Форматирование строк в документации.
Все, предлагающие использовать код строки f
, неявно предполагают, что можно корректно фиксировать количество цифр после десятичной точки. Это кажется очень шаткой предпосылкой для меня. Однако, если вы не делаете этого предположения, нет встроенного механизма для выполнения того, что вы хотите. Это лучший хак, с которым я столкнулся, столкнувшись с аналогичной проблемой (в PDF-генераторе - цифры в PDF не могут использовать экспоненциальную нотацию). Вероятно, вы хотите удалить все строки b
со строк, и здесь могут быть другие Python3-isms.
_ftod_r = re.compile(
br'^(-?)([0-9]*)(?:\.([0-9]*))?(?:[eE]([+-][0-9]+))?$')
def ftod(f):
"""Print a floating-point number in the format expected by PDF:
as short as possible, no exponential notation."""
s = bytes(str(f), 'ascii')
m = _ftod_r.match(s)
if not m:
raise RuntimeError("unexpected floating point number format: {!a}"
.format(s))
sign = m.group(1)
intpart = m.group(2)
fractpart = m.group(3)
exponent = m.group(4)
if ((intpart is None or intpart == b'') and
(fractpart is None or fractpart == b'')):
raise RuntimeError("unexpected floating point number format: {!a}"
.format(s))
# strip leading and trailing zeros
if intpart is None: intpart = b''
else: intpart = intpart.lstrip(b'0')
if fractpart is None: fractpart = b''
else: fractpart = fractpart.rstrip(b'0')
if intpart == b'' and fractpart == b'':
# zero or negative zero; negative zero is not useful in PDF
# we can ignore the exponent in this case
return b'0'
# convert exponent to a decimal point shift
elif exponent is not None:
exponent = int(exponent)
exponent += len(intpart)
digits = intpart + fractpart
if exponent <= 0:
return sign + b'.' + b'0'*(-exponent) + digits
elif exponent >= len(digits):
return sign + digits + b'0'*(exponent - len(digits))
else:
return sign + digits[:exponent] + b'.' + digits[exponent:]
# no exponent, just reassemble the number
elif fractpart == b'':
return sign + intpart # no need for trailing dot
else:
return sign + intpart + b'.' + fractpart
Это довольно стандартное форматирование печати, особенно для float:
print "%.9f" % 1.0e-9
>>> a
1.0000000000000001e-09
>>> print "heres is a small number %1.9f" %a
heres is a small number 0.000000001
>>> print "heres is a small number %1.13f" %a
heres is a small number 0.0000000010000
>>> b
11232310000000.0
>>> print "heres is a big number %1.9f" %b
heres is a big number 11232310000000.000000000
>>> print "heres is a big number %1.1f" %b
heres is a big number 11232310000000.0
Здесь zwol ответ упрощен и преобразован в стандартный формат python:
import re
def format_float_in_standard_form(f):
s = str(f)
m = re.fullmatch(r'(-?)(\d)(?:\.(\d+))?e([+-]\d+)', s)
if not m:
return s
sign, intpart, fractpart, exponent = m.groups('')
exponent = int(exponent) + 1
digits = intpart + fractpart
if exponent < 0:
return sign + '0.' + '0'*(-exponent) + digits
exponent -= len(digits)
return sign + digits + '0'*exponent + '.0'
Используйте% e при печати своего номера:
>>> a = 0.1234567
>>> print 'My number is %.7e'%a
My number 1.2345670e-01
Если вы используете% g, он автоматически выбирает лучшую визуализацию для вас:
>>> print 'My number is %.7g'%a
My number is 0.1234567