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.

Mat
sumber
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:

64
'%f' % (x/y)

tetapi Anda perlu mengatur sendiri presisi. misalnya,

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

hanya akan menampilkan angka nol.
Rinciannya ada di dokumen

Atau untuk Python 3 , pemformatan lama yang setara atau pemformatan gaya yang lebih baru

SilentGhost
sumber
7
Saya sarankan untuk mengklarifikasi pernyataan Anda untuk mengatakan, "Anda mengelola tampilan presisi sendiri." Presisi (Python internal) yang sebenarnya tidak berubah, seperti yang sering dilakukan dalam bahasa lain.
JS.
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'
Aziz Alto
sumber
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)
nmichaels
sumber
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
Josh Janjua
sumber
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='-')
Dennis Golomazov
sumber
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
Kapten Mentimun
sumber
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
Finn42
sumber
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'
Dana
sumber
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

U-571
sumber
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}

Jared Marks
sumber
-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]))
Scott Lohr
sumber
-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.

Alex S
sumber