2012-02-23 25 views
8

Đối với một ứng dụng khoa học, tôi cần xuất các số rất chính xác, vì vậy tôi phải in 15 số liệu quan trọng. Đã có câu hỏi về chủ đề này tại đây, nhưng tất cả họ đều quan tâm đến việc cắt ngắn các chữ số, chứ không phải in thêm.Làm cách nào để in nhiều số liệu quan trọng bằng Python?

Tôi nhận thấy rằng hàm print chuyển đổi đầu vào float thành 10 ký tự string. Ngoài ra, tôi đã nhận thức được mô-đun decimal, nhưng điều đó không phù hợp với nhu cầu của tôi.

Vì vậy, câu hỏi đặt ra là, làm thế nào tôi có thể dễ dàng in một số lượng biến có dấu hiệu của các phao nổi của tôi, nơi tôi cần hiển thị hơn 10?

+0

Hãy ghi nhớ rằng một 'float' có thể không thực sự có khả năng đại diện cho các giá trị mà bạn đang sử dụng với độ chính xác bạn yêu cầu, có nghĩa là tính toán của bạn rất có thể là sai lầm khủng khiếp. – geoffspear

+0

@Wooble [This] (http://stackoverflow.com/a/6163157/566644) câu trả lời rất tốt đẹp delves vào câu hỏi bạn đang nâng cao. Nó đáng xem. –

+0

Nhưng không có loại dữ liệu chính xác hơn float trong Python, phải không? – Ingo

Trả lời

12

Bạn có thể sử dụng chuỗi định dạng hành %:

In [3]: val = 1./3 

In [4]: print('%.15f' % val) 
0.333333333333333 

hoặc str.format():

In [8]: print(str.format('{0:.15f}', val)) 
Out[8]: '0.333333333333333' 

Trong mã mới, sau này là phong cách ưa thích, mặc dù trước đây vẫn được sử dụng rộng rãi.

Để biết thêm thông tin, hãy xem documentation.

+6

'print ('{0: .15f}'. Format (val))' cũng là một cách khác để làm điều đó ở định dạng mới. – TyrantWave

+3

Lưu ý rằng điều này không in được 15 chữ số _significant_, nhưng chỉ 15 chữ số sau dấu thập phân. Đối với số lượng rất lớn hoặc rất nhỏ, điều này không có ý nghĩa nhiều. IMHO, sử dụng '"% .15e "' có thể hợp lý hơn. –

3

Sử dụng hai thành ngữ in phổ biến này để định dạng. Đó là một vấn đề về sở thích cá nhân trên đó là tốt hơn.

value = 10/3   #gives a float of 3.33333..... 

print '%.15f' % value 
print str.format('{0:.15f}', value) 

Cá nhân tôi nghĩ đầu tiên gọn hơn và thứ 2 rõ ràng hơn. Định dạng có nhiều tính năng hơn khi làm việc với nhiều vals.

8

Nghĩ câu hỏi ban đầu muốn định dạng n số liệu quan trọng, chứ không phải n số thập phân. Vì vậy, một chức năng tùy chỉnh có thể được yêu cầu cho đến khi một số loại được xây dựng trong nhiều hơn được cung cấp? Vì vậy, bạn sẽ muốn một cái gì đó như:

def float_nsf(q,n): 
    """ 
    Truncate a float to n significant figures. May produce overflow in 
    very last decimal place when q < 1. This can be removed by an extra 
    formatted print. 
    Arguments: 
     q : a float 
     n : desired number of significant figures 
    Returns: 
    Float with only n s.f. and trailing zeros, but with a possible small overflow. 
    """ 
    sgn=npy.sign(q) 
    q=abs(q) 
    n=int(npy.log10(q/10.)) # Here you overwrite input n! 
    if q<1. : 
     val=q/(10**(n-1)) 
    else: 
     val=q/(10**n) 
    return sgn*int(val)*10.**n 
1

Bạn có thể sử dụng chức năng này tôi đã viết, có vẻ như được làm việc tốt và nó khá đơn giản:

def nsf(num, n=1): 
    """n-Significant Figures""" 
    numstr = ("{0:.%ie}" % (n-1)).format(num) 
    return float(numstr) 
  1. Nó cải đầu tiên số thành một chuỗi sử dụng ký hiệu số mũ số
  2. Sau đó trả về số này là float .

Một số xét nghiệm:

>>> a = 2./3 
>>> b = 1./3 
>>> c = 3141592 
>>> print(nsf(a)) 
0.7 
>>> print(nsf(a, 3)) 
0.667 
>>> print(nsf(-a, 3)) 
-0.667 
>>> print(nsf(b, 4)) 
0.3333 
>>> print(nsf(-b, 2)) 
-0.33 
>>> print(nsf(c, 5)) 
3141600.0 
>>> print(nsf(-c, 6)) 
-3141590.0 

Tôi hy vọng điều này sẽ giúp bạn;)

+0

Hmm, điều này tiếp tục phun ra các con số trong ký hiệu lũy thừa. Có lẽ vì tôi đã chuyển đổi chúng thành chuỗi sau ?, tức là str (float (...)) – DrMisha

Các vấn đề liên quan