Python ile 2 ondalığa nasıl yuvarlanır?


254

Bu kodun çıkışında bir çok ondalık sayı alıyorum (Fahrenheit'ten Santigrat'a dönüştürücü).

Kodum şu anda şöyle görünüyor:

def main():
    printC(formeln(typeHere()))

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(answer)
    print "\nYour Celsius value is " + answer + " C.\n"



main()

Benim sorum şu, programı her cevabı 2. ondalık basamağa nasıl çevirebilirim?


7
Kodunuzla ilgili küçük bir açıklama. Fahrenheit değerinin bir küresel olarak tutulması için bir neden yoktur, bunu işlevlerinize bir parametre olarak iletmek yeterlidir (ve daha iyidir). Bu nedenle, "global Fahrenheit" satırını kaldırın. Formeln işlevinde, parametreyi "Fahreinheit" formeln (Fahreinheit) işleviyle yeniden adlandırın. Yuvarlamaya gelince, yalnızca ilk% basamağı görüntülemek için "%" parametrelerini kullanabilirsiniz ve bu basamaklar için yuvarlanmalıdır. Formülde formülde yer alan basamakların sayısı üzerinde bir etkisi yoktur.
arieli

Yanıtlar:


443

roundİlk argüman olarak sayıyı alan ve ikinci argüman ondalık noktadan sonraki kesinlik olan işlevi kullanabilirsiniz .

Sizin durumunuzda:

answer = str(round(answer, 2))


21
Buna bankacılar yuvarlama denir. Çift sayıya yuvarlar. Kayan noktalı sayılar için IEEE 754 standardındadır. en.wikipedia.org/wiki/Rounding#Round_half_to_even
rolisz

37
İnsanları yukarıdaki yorumu değerlendirmek için neyin teşvik ettiğinden emin değilim. Kayıt, aslında İçin round(2.675, 2)verir 2.67ziyade 2.68Banker yuvarlama ile ilgisi hiç ilgisi yoktur.
Mark Dickinson

3
not : bu cevap değerini değiştirir. Ekran için yuvarlamak istiyorsanız, @Johnsyweb - stackoverflow.com/a/20457284/1498405
hardmooth 28:18

4
@Johnsyweb Bugün deniyorum, orijinal gönderinin ardından yıl ve beklendiği gibi çalışıyor. Yuvarlak () zamanla gelişti. Aşağıya bakınız: yuvarlak (1.379, 2) -> 1.38 yuvarlak (1.372, 2) -> 1.37 yuvarlak (1.375, 2) -> 1.38
NightFurry

83

kullanma str.format() 'ın sözdizimi için gösterilecek answer (bir temel değeri değiştirmeden iki ondalık basamaklı answer):

def printC(answer):
    print("\nYour Celsius value is {:0.2f}ºC.\n".format(answer))

Nerede:

  • :spec biçimini tanıtır
  • 0 sayısal tipler için işarete duyarlı sıfır doldurmayı etkinleştirir
  • .2ayarlar kesinlik için2
  • f numarayı sabit nokta numarası olarak görüntüler

3
Bu en yararlı cevap IMO - gerçek değeri olduğu gibi tutar ve uygulanması kolaydır! Teşekkürler!
BrettJ

Emin değilim, ama '{: 0.2f}'. Formatı (0.5357706) bana '0.54' (python 3.6) veriyor
Noam Peled

3
@NoamPeled: Neden olmasın? 0.5357...yakın olmaktır 0.54daha 0.53yuvarlama yüzden 0.54markaları anlamda.
ShadowRanger

"{:0.2f}".format(1.755)-> 1.75 "{:0.2f}".format(1.7551)-> 1.76 - Bununla birlikte, her ikisinin de 1.76'ya eşit olmasını beklerdim.
Janothan

(Python Sürümü: 3.6.10)
Janothan

48

Çoğu cevap önerdi roundveya format. roundbazen yuvarlar ve benim durumumda değişkenimin değerinin aşağı yuvarlanması ve sadece bu şekilde görüntülenmesi gerekmiyordu.

round(2.357, 2)  # -> 2.36

Cevabı burada buldum: Kayan nokta sayısını belirli bir ondalık basamağa nasıl yuvarlayabilirim?

import math
v = 2.357
print(math.ceil(v*100)/100)  # -> 2.36
print(math.floor(v*100)/100)  # -> 2.35

veya:

from math import floor, ceil

def roundDown(n, d=8):
    d = int('1' + ('0' * d))
    return floor(n * d) / d

def roundUp(n, d=8):
    d = int('1' + ('0' * d))
    return ceil(n * d) / d

1
Kaldırdım - aradığım şey bu; Python-poloniex ile çalışmanızı seviyorum: D
Skylar Saveland

2
msgstr "değerler güç eksi ndigit değerlerine 10'un en yakın katına yuvarlanır;" docs.python.org/3/library/functions.html#round yani yuvarlak, her zaman yuvarlanmaz, örn.round(2.354, 2) # -> 2.35
Pete Kirkham

@PeteKirkham haklısın, cevabımı daha anlamlı ve doğru yapmak için düzenledim.
s4w3d0ff

2
-0.54 -0.5357706 aşağı yuvarlama için doğru cevaptır, çünkü negatif bir sayıdır, -0.54 <-0.53
s4w3d0ff

2
Bunun 10**dyerine kullanırdım int('1' + ('0' * d)).
Jonathon Reinhart

11
float(str(round(answer, 2)))
float(str(round(0.0556781255, 2)))

8

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 roundfonksiyonun beklendiği importgibi 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 roundiş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-XneredeX kullanmak için çalışıyoruz sayı dizesi uzunluğudur roundartı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


6

Sadece 2 ondalığa yuvarlamanızı sağlayan% .2f ile biçimlendirmeyi kullanın.

def printC(answer):
    print "\nYour Celsius value is %.2f C.\n" % answer

4

"%" Pythonunun dize biçimlendirme işlecini kullanabilirsiniz. "% .2f", ondalık noktadan sonraki 2 basamak anlamına gelir.

def typeHere():
    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(Fahrenheit):
    Celsius = (Fahrenheit - 32.0) * 5.0/9.0
    return Celsius

def printC(answer):
    print "\nYour Celsius value is %.2f C.\n" % answer

def main():
    printC(formeln(typeHere()))

main()

http://docs.python.org/2/library/stdtypes.html#string-formatting


4

2 ondalığa kadar yuvarlak operatör kullanabilirsiniz

num = round(343.5544, 2)
print(num) // output is 343.55

3

Yuvarlak işlevini kullanabilirsiniz.

round(80.23456, 3)

size 80.234 cevabı verecek

Sizin durumunuzda,

answer = str(round(answer, 2))

2

Kayan nokta probleminden kaçınmanız gerekiyorsaMuhasebe için yuvarlama sayılarında , numpy raund kullanabilirsiniz.

Numpy yüklemeniz gerekiyor:

pip install numpy

ve kod:

import numpy as np

print(round(2.675, 2))
print(float(np.round(2.675, 2)))

baskılar

2.67
2.68

Parayı yasal yuvarlama ile yönetiyorsanız bunu kullanmalısınız.


1

İşte kullandığım bir örnek:

def volume(self):
    return round(pi * self.radius ** 2 * self.height, 2)

def surface_area(self):
    return round((2 * pi * self.radius * self.height) + (2 * pi * self.radius ** 2), 2)

1

Neden olduğundan emin değilim, ancak '{: 0.2f}'. Formatı (0.5357706) bana '0.54' veriyor. Benim için çalışan tek çözüm (python 3.6) şudur:

def ceil_floor(x):
    import math
    return math.ceil(x) if x < 0 else math.floor(x)

def round_n_digits(x, n):
    import math
    return ceil_floor(x * math.pow(10, n)) / math.pow(10, n)

round_n_digits(-0.5357706, 2) -> -0.53 
round_n_digits(0.5357706, 2) -> 0.53

Bu kesiliyor, yuvarlama değil.
ShadowRanger


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.