Cevabınızı yuvarlamak istiyorsunuz.
round(value,significantDigit)
bunu yapmak için sıradan bir çözümdür, ancak bazen basamak yuvarladığınız rakamın hemen altında (solunda) bir matematik perspektifinden beklendiği gibi çalışmaz 5
.
Bu öngörülemeyen davranışa bazı örnekler:
>>> round(1.0005,3)
1.0
>>> round(2.0005,3)
2.001
>>> round(3.0005,3)
3.001
>>> round(4.0005,3)
4.0
>>> round(1.005,2)
1.0
>>> round(5.005,2)
5.0
>>> round(6.005,2)
6.0
>>> round(7.005,2)
7.0
>>> round(3.005,2)
3.0
>>> round(8.005,2)
8.01
Amacınız bilimlerde istatistik için geleneksel yuvarlama yapmak olduğunu varsayarsak, bu round
fonksiyonun beklendiği import
gibi ekstra şeylere ihtiyaç duyduğu şekilde çalışmasını sağlamak için kullanışlı bir sarıcıdır Decimal
.
>>> round(0.075,2)
0.07
>>> round(0.075+10**(-2*6),2)
0.08
Aha! Buna dayanarak bir işlev yapabiliriz ...
def roundTraditional(val,digits):
return round(val+10**(-len(str(val))-1), digits)
Temel olarak bu, dizeye, beklenmedik şekilde round
işlevle normalde olmadığı tahmin edilemeyen örneklerde düzgün bir şekilde yuvarlanması için gerçekten küçük bir değer ekler . Eklemek için uygun bir değer 1e-X
neredeX
kullanmak için çalışıyoruz sayı dizesi uzunluğudur round
artınız1
.
10**(-len(val)-1)
Vardiyayı zorlamak için ekleyebileceğiniz en büyük küçük sayı olduğu için kullanma yaklaşımı kasıtlıydı, ayrıca eklediğiniz değerin ondalık .
eksik olmasa bile yuvarlamayı asla değiştirmediğinden emin olun . 10**(-len(val))
Çıkarmak if (val>1)
için sadece bir şartla kullanabilirim1
daha fazla ... ama her zaman çıkarmak basittir, 1
çünkü bu geçici çözümün düzgün işleyebileceği geçerli ondalık sayı aralığını çok fazla değiştirmez. Değerleriniz türün sınırlarına ulaşırsa bu yaklaşım başarısız olur, bu başarısız olur, ancak geçerli ondalık değerlerin neredeyse tamamı için çalışması gerekir.
Böylece bitmiş kod şuna benzer:
def main():
printC(formeln(typeHere()))
def roundTraditional(val,digits):
return round(val+10**(-len(str(val))-1))
def typeHere():
global Fahrenheit
try:
Fahrenheit = int(raw_input("Hi! Enter Fahrenheit value, and get it in Celsius!\n"))
except ValueError:
print "\nYour insertion was not a digit!"
print "We've put your Fahrenheit value to 50!"
Fahrenheit = 50
return Fahrenheit
def formeln(c):
Celsius = (Fahrenheit - 32.00) * 5.00/9.00
return Celsius
def printC(answer):
answer = str(roundTraditional(answer,2))
print "\nYour Celsius value is " + answer + " C.\n"
main()
... beklediğiniz sonuçları vermelisiniz.
Bunu yapmak için ondalık kütüphaneyi de kullanabilirsiniz , ancak önerdiğim sarıcı daha basittir ve bazı durumlarda tercih edilebilir.
Düzenleme: Saçak durumda sadece belirli değerler için burada olduğunu gösteren işaret için teşekkürler Blckknght .5