Kayan nokta sayısını belirli bir hassasiyete dönüştürün ve sonra dizeye kopyalayın


144

Kayan nokta numaram var diyelim 135.12345678910. Bu değeri bir dizeye bitiştirmek istiyorum, ama sadece istiyorum 135.123456789. Baskı ile, böyle bir şey yaparak bunu kolayca yapabilirim:

print "%.9f" % numvar

ile numvarbenim orijinal sayı olmak. Bunu yapmanın kolay bir yolu var mı?


3
% tam olarak bunu yapar -%, yazdırma işlevinin değil, dizenin bir parçasıdır - bkz. Python belgeleri
michael_s

Yanıtlar:


177

Python <3 (örneğin 2.6 [yorumlara bakın] veya 2.7) ile bunu yapmanın iki yolu vardır.

# Option one
older_method_string = "%.9f" % numvar

# Option two
newer_method_string = "{:.9f}".format(numvar)

Ancak 3'ün üzerindeki Python sürümleri için (ör. 3.2 veya 3.3), ikinci seçeneğin tercih edildiğine dikkat edin .

İkinci seçenek hakkında daha fazla bilgi için , Python belgelerinden dize biçimlendirme ile ilgili bu bağlantıyı öneriyorum .

Birinci seçenek hakkında daha fazla bilgi için, bu bağlantı yeterli olacaktır ve çeşitli bayraklar hakkında bilgi sahibi olacaktır .

Python 3.6 (resmi olarak Aralık 2016'da piyasaya sürüldü), fdizgi hazır bilgisini ekledi, burada daha fazla bilgiye bakın , bu str.formatyöntemi genişletir ( f"{numvar:.9f}"orijinal sorunu çözecek şekilde kıvırcık parantez kullanımı ), yani,

# Option 3 (versions 3.6 and higher)
newest_method_string = f"{numvar:.9f}"

sorunu çözer. Daha fazla bilgi için @ Or-Duan'ın cevabına göz atın, ancak bu yöntem hızlıdır .


1
seçenek iki olmalıdır newer_method_string = "{:.9f}".format(numvar)- :alanı ve biçimlendirmeyi ayırmak için gerekli olanı not edin . Bunu yine de 2.7.5'te test ettim.
Caltor

1
Python 2.6 için seçenek iki olmalıdır newer_method_string = "{0:.9f}".format(numvar)- bu eski sürüm için alan_adı için gerekli 0 değerini not edin.
ttq

56

Python 3.6

Sadece netleştirmek için f-string biçimlendirmesini kullanabilirsiniz. Bu, yöntemle neredeyse aynı sözdizimine sahiptir format, ancak biraz daha güzel olmasını sağlar.

Misal:

print(f'{numvar:.9f}')

Yeni f dizesi hakkında daha fazla bilgi:

Aşağıda, test edilen çeşitli yöntemlerin yürütme sürelerinin bir diyagramı (yukarıdaki son bağlantıdan):

uygulama süreleri


52

Kullanma round:

>>> numvar = 135.12345678910
>>> str(round(numvar, 9))
'135.123456789'

8

Biçimlendirmeyi yapan baskı değil, dizelerin bir özelliği, böylece sadece

newstring = "%.9f" % numvar

Veya yeni stil formatını kullanın. valueString = "{:. 9f}". biçim (sayı)
Zaren

8

Hassasiyetin çalışma zamanına kadar bilinmemesi durumunda, bu diğer biçimlendirme seçeneği yararlıdır:

>>> n = 9
>>> '%.*f' % (n, numvar)
'135.123456789'

3
Kullanmak tercih ederseniz .formatkullanılan yöntem, bu da yuvalama argümanlar tarafından yapılabileceğini not beni çok seviyorum: '{:.{n}f}'.format(numvar,n=n).
nivk

2

9 basamaklı hassasiyeti ayarlamak için:

print "%.9f" % numvar

2 basamaklı dönüş hassasiyeti:

print "%.2f" % numvar 

2 basamaklı ve float dönüştürülmüş değerle dönüş hassasiyeti:

numvar = 4.2345
print float("%.2f" % numvar) 

-2

strFonksiyon bir hata var. Lütfen aşağıdakileri deneyin. '0,196553' göreceksiniz, ancak doğru çıktı '0,196554'. Çünkü strişlevin varsayılan değeri ROUND_HALF_UP.

>>> value=0.196553500000 
>>> str("%f" % value).replace(".", ",")

2
Derdin ne .vs. ,? Peki pauliwago'nun sorusuyla ne kadar ilgili?
Peter Mortensen
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.