Bagaimana cara menekan notasi ilmiah saat mencetak nilai float?


147

Ini kode saya:

x = 1.0
y = 100000.0    
print x/y

Hasil bagi saya ditampilkan sebagai 1.00000e-05.

Apakah ada cara untuk menekan notasi ilmiah dan membuatnya ditampilkan sebagai 0.00001? Saya akan menggunakan hasilnya sebagai string.


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

@ AA, dengan asumsi itu salah ketik dalam pernyataan penugasan, saya sudah memperbaikinya.
Dana

Sangat mengecewakan bahwa tidak ada jawaban di sini yang menjawab pertanyaan itu. Alangkah baiknya jika ada cara untuk mencegah python (3) dari menggunakan notasi ilmiah sama sekali kecuali bila ditentukan secara eksplisit. Semua jawaban mengharuskan pengguna untuk secara eksplisit menekan notasi ilmiah, yang tidak sama dengan umumnya menekan penggunaan notasi ilmiah implisit dari dalam python.
BLUC

Jawaban:



92

Menggunakan versi yang lebih baru ''.format(juga ingat untuk menentukan berapa digit setelah .Anda ingin ditampilkan, ini tergantung pada seberapa kecil angka mengambang). Lihat contoh ini:

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

seperti yang ditunjukkan di atas, standarnya adalah 6 digit! Ini tidak membantu untuk contoh kasus kami, jadi alih-alih kami dapat menggunakan sesuatu seperti ini:

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

Memperbarui

Mulai dengan Python 3.6, ini dapat disederhanakan dengan string literal yang diformat , sebagai berikut:

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

Bagaimana melakukan ini ketika menentukan angka penting?
Marses

Saya kira dengan menggunakan variabel, berikan jumlah angka yang diinginkan, dan gunakan itu sebagai ganti angka literal misalnyaf"{a:.{precision}f}"
Aziz Alto

49

Dengan versi Python yang lebih baru (2.6 dan yang lebih baru), Anda dapat menggunakan ''.format()untuk mencapai apa yang disarankan @SilentGhost:

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

1
Benarkah ini yang Anda inginkan? Saya tidak: >>> print('{:f}'.format(0.000000123)) 0.000000
dualitas_

1
@ kualitas Anda mungkin perlu menentukan presisi. '{0:.10f}'
nmichaels

24

Opsi lain, jika Anda menggunakan panda dan ingin menekan notasi ilmiah untuk semua pelampung, adalah menyesuaikan opsi panda.

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

10

Sebagian besar jawaban di atas mengharuskan Anda menentukan ketepatan. Tetapi bagaimana jika Anda ingin menampilkan pelampung seperti ini, tanpa nol yang tidak perlu:

1
0.1
0.01
0.001
0.0001
0.00001
0.000001
0.000000000001

numpy punya jawaban: np.format_float_positional

import numpy as np

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

5

Ini akan bekerja untuk eksponen apa pun:

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

Ini menggunakan jawaban Captain Cucumber , tetapi dengan 2 tambahan.

1) memungkinkan fungsi untuk mendapatkan nomor notasi non ilmiah dan hanya mengembalikannya apa adanya (sehingga Anda dapat membuang banyak input bahwa beberapa angka adalah 0,00003123 vs 3,123e-05 dan masih memiliki fungsi berfungsi.

2) menambahkan dukungan untuk angka negatif. (dalam fungsi asli, angka negatif akan berakhir seperti 0,0000-108904 dari -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

Selain jawaban SG, Anda juga dapat menggunakan modul Desimal:

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

# x is a string '0.0001'

14
itu berubah menjadi notasi ilmiah untuk nilai-nilai yang lebih kecil dari 1e-6
SilentGhost

2

Jika a stringmaka gunakan bawaan floatuntuk melakukan konversi misalnya: print( "%.5f" % float("1.43572e-03")) answer:0.00143572


1

Karena ini adalah hasil teratas di Google, saya akan memposting di sini setelah gagal menemukan solusi untuk masalah saya. Jika Anda ingin memformat nilai tampilan objek float dan membuatnya tetap float - bukan string, Anda dapat menggunakan solusi ini:

Buat kelas baru yang mengubah cara nilai float ditampilkan.

from builtins import float
class FormattedFloat(float):

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

Anda dapat memodifikasi sendiri presisi dengan mengubah nilai integer di {:f}


-1

Menggunakan 3.6.4, saya mengalami masalah serupa yang secara acak, nomor dalam file output akan diformat dengan notasi ilmiah saat menggunakan ini:

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

Yang harus saya lakukan untuk memperbaikinya adalah menambahkan 'f':

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

-1

Pada 3,6 (mungkin bekerja dengan 3.x sedikit lebih tua juga), ini adalah solusi saya:

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')

Tujuan dari precisionperhitungan ini adalah untuk memastikan kami memiliki cukup presisi untuk menghindari notasi ilmiah (presisi default masih 6).

The dec_precisionArgumen menambahkan presisi tambahan untuk menggunakan untuk poin desimal. Karena ini menggunakan nformat, tidak ada nol yang tidak signifikan akan ditambahkan (tidak seperti fformat). njuga akan menangani rendering bilangan bulat yang sudah bulat tanpa desimal.

nmemang membutuhkan floatinput, sehingga pemain.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.