Bir floatı yuvarlamadan dizeye dönüştürme

Açıklanması gerekmeyen nedenlerden dolayı, bir floatın len() ile sayılacak bir dizeye dönüştürülmesini gerektiren bir program yapıyorum. Ancak, str(float(x)) bir dizeye dönüştürüldüğünde x'in yuvarlanmasına neden oluyor ve bu da her şeyi bozuyor. Bunun için bir düzeltme bilen var mı? Eğer bilmek istiyorsanız işte kullanılan kod:

len(str(float(x)/3))
Çözüm

Kayan noktalı sayılarla çalışırken bir tür yuvarlama genellikle kaçınılmazdır. Bunun nedeni, tam olarak 10 tabanında ifade edebileceğiniz sayıların her zaman tam olarak 2 tabanında (bilgisayarınızın kullandığı) ifade edilememesidir.

Örneğin:

>>> .1
0.10000000000000001

Bu durumda, .1'in `repr' kullanılarak bir dizeye dönüştürüldüğünü görüyorsunuz:

>>> repr(.1)
'0.10000000000000001'

Python'un bu sorunu aşmak için str() kullandığınızda son birkaç rakamı kestiğine inanıyorum, ancak bu, neler olup bittiğini anlamanın yerini tutmayan kısmi bir geçici çözümdür.

>>> str(.1)
'0.1'

Yuvarlama"nın size tam olarak hangi sorunlara yol açtığından emin değilim. Belki de çıktınızı daha hassas bir şekilde kontrol etmenin bir yolu olarak dize biçimlendirmesi ile daha iyi yaparsınız?

Örneğin.

>>> '%.5f' % .1
'0.10000'
>>> '%.5f' % .12345678
'0.12346'

Dokümantasyon burada.

Yorumlar (0)
len(repr(float(x)/3))

Ancak bunun düşündüğünüz kadar güvenilir olmadığını söylemeliyim.

Kayan sayılar ondalık sayı olarak girilir/gösterilir, ancak bilgisayarınız (aslında standart C kütüphaneniz) bunları ikili olarak depolar. Bu geçişten bazı yan etkiler elde edersiniz:

>>> print len(repr(0.1))
19
>>> print repr(0.1)
0.10000000000000001

Bunun neden olduğuna dair açıklama python eğitiminin bu bölümünde yer almaktadır.

Bir çözüm, python'un decimal.Decimal gibi özellikle ondalık sayıları izleyen bir tür kullanmak olabilir:

>>> print len(str(decimal.Decimal('0.1')))
3
Yorumlar (1)

Diğer cevaplar, kayan sayıların temsilinin en hafif tabirle çetrefilli bir konu olduğuna işaret etmiştir.

Sorunuzda yeterli bağlam vermediğiniz için, ondalık modülün ihtiyaçlarınız için yararlı olup olamayacağını bilemiyorum:

http://docs.python.org/library/decimal.html

Diğer şeylerin yanı sıra, elde etmek istediğiniz hassasiyeti açıkça belirtebilirsiniz (dokümanlardan):

>>> getcontext().prec = 6
>>> Decimal('3.0')
Decimal('3.0')
>>> Decimal('3.1415926535')
Decimal('3.1415926535')
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85987')
>>> getcontext().rounding = ROUND_UP
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85988')

Benim komut istemimden basit bir örnek (python 2.6):

>>> import decimal
>>> a = decimal.Decimal('10.000000001')
>>> a
Decimal('10.000000001')
>>> print a
10.000000001
>>> b = decimal.Decimal('10.00000000000000000000000000900000002')
>>> print b
10.00000000000000000000000000900000002
>>> print str(b)
10.00000000000000000000000000900000002
>>> len(str(b/decimal.Decimal('3.0')))
29

Belki bu yardımcı olabilir? decimal 2.4'ten beri python stdlib'dedir, python 2.6'da eklemeler yapılmıştır.

Umarım bu yardımcı olur, Francesco

Yorumlar (0)