Şamandıra değerleri yazdırılırken bilimsel gösterimi nasıl bastırabilirim?


147

İş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.


1
1/10000 = 0.0001 = 1.00000e-04
Adrian Archer

@AA, atama deyiminde bir yazım hatası olduğunu varsayarak düzelttim.
Dana

Buradaki cevapların hiçbirinin soruyu ele almaması hayal kırıklığı yaratıyor. Açıkça belirtilmedikçe, python'un (3) bilimsel gösterimi kullanmasını önlemenin bir yolu olsaydı iyi olurdu. Tüm cevaplar kullanıcının bilimsel gösterimi açıkça bastırmasını gerektirir ki bu genellikle bilimsel gösterimin python içinden örtülü kullanımını bastırmakla aynı şey değildir.
BLUC

Yanıtlar:



92

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'

Güncelleme

Python 3.6'dan başlayarak, bu yeni biçimlendirilmiş dize hazır bilgisi ile basitleştirilebilir :

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

Yine de önemli rakamlar belirtilirken bu nasıl yapılır?
Marses

Bir değişken kullanarak tahmin ediyorum, istenilen sayıda rakam verin ve değişmez sayı yerine bunu kullanın örneğinf"{a:.{precision}f}"
Aziz Alto

49

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)

1
Gerçekten istediğin bu mu? >>> print('{:f}'.format(0.000000123)) 0.000000
Yapmıyorum

1
@duality kesinlik belirtmeniz gerekebilir. '{0:.10f}'
nmichaels

24

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

10

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

5

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

4

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

3

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'

15
1e-6'dan küçük değerler için bilimsel gösterime dönüşüyor
SilentGhost

2

Öyleyse , dönüştürmeyi yapmak için stringyerleşik olanı kullanın, floatörneğin: print( "%.5f" % float("1.43572e-03")) answer:0.00143572


1

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}


-1

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

-1

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

precisionHesaplamanı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_precisiondeğişken, ondalık basamaklar için ek hassasiyet ekler. Bu, nbiçimi kullandığından, önemsiz sıfırlar eklenmez ( fbiçimlerin aksine ). nAyrıca, ondalık olmadan zaten yuvarlak olan tamsayıların oluşturulmasına da özen gösterir.

nfloatgiriş gerektirir , dolayısıyla döküm.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.