İşte benim kod:
x = 1.0
y = 100000.0
print x/y
Bölümüm olarak görüntülenir 1.00000e-05
.
Bilimsel gösterimi bastırmanın ve gösterilmesini sağlamanın bir yolu var mı
0.00001
? Sonucu bir dize olarak kullanacağım.
İşte benim kod:
x = 1.0
y = 100000.0
print x/y
Bölümüm olarak görüntülenir 1.00000e-05
.
Bilimsel gösterimi bastırmanın ve gösterilmesini sağlamanın bir yolu var mı
0.00001
? Sonucu bir dize olarak kullanacağım.
Yanıtlar:
'%f' % (x/y)
ancak hassasiyeti kendiniz yönetmeniz gerekir. Örneğin,
'%f' % (1/10**8)
yalnızca sıfır görüntüleyecektir.
ayrıntılar dokümanlarda
Veya Python 3 için eşdeğer eski biçimlendirme veya daha yeni stil biçimlendirme
Daha yeni sürümü kullanarak ''.format
(ayrıca .
görüntülemek istediğiniz sayıdan sonra kaç basamak olduğunu belirtmeyi unutmayın , bu kayan sayının ne kadar küçük olduğuna bağlıdır). Bu örneğe bakın:
>>> a = -7.1855143557448603e-17
>>> '{:f}'.format(a)
'-0.000000'
Yukarıda gösterildiği gibi, varsayılan 6 rakamdır! Bu bizim vaka örneğimiz için yararlı değildir, bunun yerine şöyle bir şey kullanabiliriz:
>>> '{:.20f}'.format(a)
'-0.00000000000000007186'
Python 3.6'dan başlayarak, bu yeni biçimlendirilmiş dize hazır bilgisi ile basitleştirilebilir :
>>> f'{a:.20f}'
'-0.00000000000000007186'
f"{a:.{precision}f}"
Python'un (2.6 ve üstü) daha yeni sürümleriyle, ''.format()
@SilentGhost'un önerilerini gerçekleştirmek için kullanabilirsiniz :
'{0:f}'.format(x/y)
>>> print('{:f}'.format(0.000000123))
0.000000
'{0:.10f}'
Pandaları kullanıyorsanız ve tüm şamandıralar için bilimsel gösterimi bastırmak istiyorsanız, başka bir seçenek de panda seçeneklerini ayarlamaktır.
import pandas as pd
pd.options.display.float_format = '{:.2f}'.format
Yukarıdaki cevapların çoğunda kesinlik belirtmeniz gerekir. Ancak, gereksiz sıfırlar olmadan böyle şamandıralar görüntülemek istiyorsanız:
1
0.1
0.01
0.001
0.0001
0.00001
0.000001
0.000000000001
numpy
bir cevabı var: np.format_float_positional
import numpy as np
def format_float(num):
return np.format_float_positional(num, trim='-')
Bu herhangi bir üs için çalışacaktır:
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
Bu, Captain Cucumber'ın cevabını kullanıyor , ancak 2 eklemeyle.
1) fonksiyonun bilimsel olmayan gösterim sayıları almasına ve bunları olduğu gibi döndürmesine izin vermek (böylece bazı sayıların 0.00003123'e karşı 3.123e-05 olduğu ve hala işlev çalışması olduğu için çok fazla girdi atabilirsiniz.
2) negatif sayılar için destek eklendi. (orijinal işlevde, negatif bir sayı -1.08904e-05'ten 0.0000-108904 gibi sonuçlanır)
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
SG'nin cevabına ek olarak, Ondalık modülünü de kullanabilirsiniz:
from decimal import Decimal
x = str(Decimal(1) / Decimal(10000))
# x is a string '0.0001'
Bu Google'daki en iyi sonuç olduğundan, sorunum için bir çözüm bulamadan sonra buraya göndereceğim. Bir kayan nesnenin görüntüleme değerini biçimlendirmek ve kayan bir dize olarak değil, kayan bir değer kalmasını istiyorsanız bu çözümü kullanabilirsiniz:
Kayan değerlerin görüntülenme biçimini değiştiren yeni bir sınıf oluşturun.
from builtins import float
class FormattedFloat(float):
def __str__(self):
return "{:.10f}".format(self).rstrip('0')
İçindeki tamsayı değerlerini değiştirerek hassasiyeti kendiniz değiştirebilirsiniz. {:f}
3.6.4 kullanarak, ben rastgele, çıktı dosyasındaki bir sayı bunu kullanırken bilimsel gösterim ile biçimlendirilir benzer bir sorun vardı:
fout.write('someFloats: {0:0.8},{1:0.8},{2:0.8}'.format(someFloat[0], someFloat[1], someFloat[2]))
Düzeltmek için tek yapmam gereken 'f' eklemekti:
fout.write('someFloats: {0:0.8f},{1:0.8f},{2:0.8f}'.format(someFloat[0], someFloat[1], someFloat[2]))
3.6 itibariyle (muhtemelen biraz daha eski 3.x ile de çalışır), bu benim çözümüm:
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')
precision
Hesaplamanın amacı bilimsel gösterimden uzak tutmak için yeterli hassasiyete sahip olmamızı sağlamaktır (varsayılan hassasiyet hala 6'dır).
Bağımsız dec_precision
değişken, ondalık basamaklar için ek hassasiyet ekler. Bu, n
biçimi kullandığından, önemsiz sıfırlar eklenmez ( f
biçimlerin aksine ). n
Ayrıca, ondalık olmadan zaten yuvarlak olan tamsayıların oluşturulmasına da özen gösterir.
n
float
giriş gerektirir , dolayısıyla döküm.