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.
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.
Jawaban:
'%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
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'
Mulai dengan Python 3.6, ini dapat disederhanakan dengan string literal yang diformat , sebagai berikut:
>>> f'{a:.20f}'
'-0.00000000000000007186'
f"{a:.{precision}f}"
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)
>>> print('{:f}'.format(0.000000123))
0.000000
'{0:.10f}'
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
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='-')
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
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
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'
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}
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]))
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 precision
perhitungan ini adalah untuk memastikan kami memiliki cukup presisi untuk menghindari notasi ilmiah (presisi default masih 6).
The dec_precision
Argumen menambahkan presisi tambahan untuk menggunakan untuk poin desimal. Karena ini menggunakan n
format, tidak ada nol yang tidak signifikan akan ditambahkan (tidak seperti f
format). n
juga akan menangani rendering bilangan bulat yang sudah bulat tanpa desimal.
n
memang membutuhkan float
input, sehingga pemain.