Làm thế nào để loại bỏ ký hiệu khoa học khi in giá trị float?


147

Đây là mã của tôi:

x = 1.0
y = 100000.0    
print x/y

Thương của tôi hiển thị như 1.00000e-05.

Có cách nào để ngăn chặn ký hiệu khoa học và làm cho nó hiển thị như 0.00001? Tôi sẽ sử dụng kết quả như một chuỗi.


1
1/10000 = 0,0001 = 1,00000e-04
Adrian Archer

@AA, giả sử đó là một lỗi đánh máy trong câu lệnh gán, tôi đã sửa nó.
Dana

Thật đáng thất vọng khi không có câu trả lời nào ở đây giải quyết câu hỏi. Sẽ thật tuyệt nếu có một cách để ngăn trăn (3) sử dụng ký hiệu khoa học trừ khi được chỉ định rõ ràng. Tất cả các câu trả lời yêu cầu người dùng loại bỏ một cách rõ ràng các ký hiệu khoa học, điều này không giống như nói chung là triệt tiêu việc sử dụng các ký hiệu khoa học ngầm từ bên trong python.
BLUC

Câu trả lời:


64
'%f' % (x/y)

nhưng bạn cần phải tự quản lý chính xác. ví dụ,

'%f' % (1/10**8)

sẽ chỉ hiển thị số không.
chi tiết có trong tài liệu

Hoặc đối với Python 3 định dạng cũ tương đương hoặc định dạng kiểu mới hơn


7
Tôi đề nghị làm rõ tuyên bố của bạn để nói, "bạn tự quản lý việc hiển thị độ chính xác". Độ chính xác thực tế (nội bộ Python) không thay đổi, như thường được thực hiện trong các ngôn ngữ khác.
JS.

92

Sử dụng phiên bản mới hơn ''.format(cũng nhớ xác định có bao nhiêu chữ số sau khi .bạn muốn hiển thị, điều này phụ thuộc vào số lượng nhỏ là số nổi). Xem ví dụ này:

>>> a = -7.1855143557448603e-17
>>> '{:f}'.format(a)
'-0.000000'

như hình trên, mặc định là 6 chữ số! Điều này không hữu ích cho ví dụ trường hợp của chúng tôi, vì vậy thay vào đó chúng tôi có thể sử dụng một cái gì đó như thế này:

>>> '{:.20f}'.format(a)
'-0.00000000000000007186'

Cập nhật

Bắt đầu trong Python 3.6, điều này có thể được đơn giản hóa với chuỗi ký tự được định dạng mới , như sau:

>>> f'{a:.20f}'
'-0.00000000000000007186'

Làm thế nào để làm điều này trong khi chỉ định số liệu quan trọng mặc dù?
Sao Hỏa

Tôi đoán bằng cách sử dụng một biến, cung cấp cho nó số mong muốn của các chữ số, và sử dụng nó thay vì số ví dụ như đenf"{a:.{precision}f}"
Aziz Alto

49

Với các phiên bản mới hơn của Python (2.6 trở lên), bạn có thể sử dụng ''.format()để thực hiện những gì @SilentGhost đã đề xuất:

'{0:f}'.format(x/y)

1
Đây thực sự là những gì bạn muốn? Tôi không: >>> print('{:f}'.format(0.000000123)) 0.000000
duality_

1
@duality bạn có thể cần phải xác định chính xác. '{0:.10f}'
nmichaels

24

Một tùy chọn khác, nếu bạn đang sử dụng gấu trúc và muốn loại bỏ ký hiệu khoa học cho tất cả các phao, là điều chỉnh các tùy chọn gấu trúc.

import pandas as pd
pd.options.display.float_format = '{:.2f}'.format

10

Hầu hết các câu trả lời ở trên yêu cầu bạn chỉ định độ chính xác. Nhưng nếu bạn muốn hiển thị số float như thế này, không có số không cần thiết:

1
0.1
0.01
0.001
0.0001
0.00001
0.000001
0.000000000001

numpy có một câu trả lời: np.format_float_positional

import numpy as np

def format_float(num):
    return np.format_float_positional(num, trim='-')

5

Điều này sẽ làm việc cho bất kỳ số mũ:

def getExpandedScientificNotation(flt):
    str_vals = str(flt).split('e')
    coef = float(str_vals[0])
    exp = int(str_vals[1])
    return_val = ''
    if int(exp) > 0:
        return_val += str(coef).replace('.', '')
        return_val += ''.join(['0' for _ in range(0, abs(exp - len(str(coef).split('.')[1])))])
    elif int(exp) < 0:
        return_val += '0.'
        return_val += ''.join(['0' for _ in range(0, abs(exp) - 1)])
        return_val += str(coef).replace('.', '')
    return return_val

4

Điều này đang sử dụng câu trả lời của Captain Cucumber , nhưng với 2 bổ sung.

1) cho phép hàm lấy các số ký hiệu không khoa học và chỉ cần trả về chúng (vì vậy bạn có thể ném rất nhiều đầu vào mà một số số là 0,00003123 so với 3.123e-05 và vẫn có chức năng hoạt động.

2) thêm hỗ trợ cho số âm. (trong chức năng ban đầu, một số âm sẽ kết thúc như 0,0000-108904 từ -1,08904e-05)

def getExpandedScientificNotation(flt):
    was_neg = False
    if not ("e" in flt):
        return flt
    if flt.startswith('-'):
        flt = flt[1:]
        was_neg = True 
    str_vals = str(flt).split('e')
    coef = float(str_vals[0])
    exp = int(str_vals[1])
    return_val = ''
    if int(exp) > 0:
        return_val += str(coef).replace('.', '')
        return_val += ''.join(['0' for _ in range(0, abs(exp - len(str(coef).split('.')[1])))])
    elif int(exp) < 0:
        return_val += '0.'
        return_val += ''.join(['0' for _ in range(0, abs(exp) - 1)])
        return_val += str(coef).replace('.', '')
    if was_neg:
        return_val='-'+return_val
    return return_val

3

Ngoài câu trả lời của SG, bạn cũng có thể sử dụng mô-đun thập phân:

from decimal import Decimal
x = str(Decimal(1) / Decimal(10000))

# x is a string '0.0001'

14
nó chuyển sang ký hiệu khoa học cho các giá trị nhỏ hơn 1e-6
SilentGhost

2

Nếu đó là một stringthì sử dụng tích hợp sẵn floatđể thực hiện chuyển đổi chẳng hạn: print( "%.5f" % float("1.43572e-03")) answer:0.00143572


1

Vì đây là kết quả hàng đầu trên Google, tôi sẽ đăng ở đây sau khi không tìm được giải pháp cho vấn đề của mình. Nếu bạn đang tìm cách định dạng giá trị hiển thị của một đối tượng float và nó vẫn là một float - không phải là một chuỗi, bạn có thể sử dụng giải pháp này:

Tạo một lớp mới sửa đổi cách hiển thị các giá trị float.

from builtins import float
class FormattedFloat(float):

    def __str__(self):
        return "{:.10f}".format(self).rstrip('0')

Bạn có thể tự sửa đổi độ chính xác bằng cách thay đổi các giá trị nguyên trong {:f}


-1

Sử dụng 3.6.4, tôi đã gặp một vấn đề tương tự ngẫu nhiên, một số trong tệp đầu ra sẽ được định dạng bằng ký hiệu khoa học khi sử dụng:

fout.write('someFloats: {0:0.8},{1:0.8},{2:0.8}'.format(someFloat[0], someFloat[1], someFloat[2]))

Tất cả những gì tôi phải làm để khắc phục nó là thêm 'f':

fout.write('someFloats: {0:0.8f},{1:0.8f},{2:0.8f}'.format(someFloat[0], someFloat[1], someFloat[2]))

-1

Kể từ 3.6 (có lẽ cũng hoạt động với 3.x cũ hơn một chút), đây là giải pháp của tôi:

import locale
locale.setlocale(locale.LC_ALL, '')

def number_format(n, dec_precision=4):
    precision = len(str(round(n))) + dec_precision
    return format(float(n), f'.{precision}n')

Mục đích của precisiontính toán là để đảm bảo chúng tôi có đủ độ chính xác để tránh các ký hiệu khoa học (độ chính xác mặc định vẫn là 6).

Đối dec_precisionsố thêm độ chính xác bổ sung để sử dụng cho các dấu thập phân. Vì điều này sử dụng nđịnh dạng, sẽ không có số không đáng kể nào được thêm vào (không giống như fcác định dạng). ncũng sẽ chăm sóc kết xuất các số nguyên đã làm tròn mà không có số thập phân.

nkhông yêu cầu floatđầu vào, do đó, diễn viên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.