2011-12-01 30 views
8

Vì vậy, đây hoạt động tốt:Force python để không ra một phao ở dạng chuẩn/ký hiệu khoa học/form mũ

>>> float(1.0e-1) 
0.10000000000000001 

Nhưng khi giao dịch với một số lượng lớn, nó sẽ không in:

>>> float(1.0e-9) 
1.0000000000000001e-09 

Có cách nào để ép buộc điều này không? Có thể sử dụng numpy hoặc một cái gì đó.

+1

bản sao có thể có của [In số phao ở dạng bình thường, không phải số mũ] (http://stackoverflow.com/questions/7801586/print-a-float-number-in-normal-form-not-exponential) –

Trả lời

15
print '{0:.10f}'.format(1.0e-9) 

String formatting trong tài liệu.

+0

Doesn ' t làm việc trước Python 2.6 (mà không phải là một vấn đề lớn, nhưng bạn nên đã đề cập đến nó). Nghiêm trọng hơn, điều này sửa số chữ số sau dấu thập phân, có lẽ không phải là những gì OP muốn. – zwol

3

Đây là định dạng in khá chuẩn, đặc biệt cho một float:

print "%.9f" % 1.0e-9 
1
>>> 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 
9

Mọi người đều cho thấy việc sử dụng các mã định dạng f chuỗi được ngầm giả định rằng nó không quan trọng để ấn định số chữ số sau dấu thập phân. Điều đó có vẻ giống như một giả định rất run rẩy với tôi. Tuy nhiên, nếu bạn không đưa ra giả định đó, không có cơ chế tích hợp để thực hiện những gì bạn muốn. Đây là hack tốt nhất mà tôi đã đưa ra khi đối mặt với một vấn đề tương tự (trong một máy phát PDF - số trong PDF không thể sử dụng ký pháp mũ). Bạn có thể muốn lấy tất cả các chuỗi b khỏi các chuỗi và có thể có các Python-isms khác ở đây.

_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 
0

Sử dụng% e khi in số điện thoại:

>>> a = 0.1234567 
>>> print 'My number is %.7e'%a 
My number 1.2345670e-01 

Nếu bạn sử dụng% g nó sẽ tự động chọn hình dung tốt nhất cho bạn:

>>> print 'My number is %.7g'%a 
My number is 0.1234567 
1

Dưới đây là câu trả lời của Zwol đơn giản hóa và chuyển đổi định dạng chuẩn 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' 
Các vấn đề liên quan