Anda ingin melengkapi jawaban Anda.
round(value,significantDigit)adalah solusi biasa untuk melakukan ini, namun ini kadang - kadang tidak beroperasi seperti yang diharapkan dari perspektif matematika ketika angka tersebut langsung lebih rendah (di sebelah kiri) angka yang Anda bulatkan memiliki 5.
Berikut beberapa contoh perilaku yang tidak dapat diprediksi ini:
>>> 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
Dengan asumsi tujuan Anda adalah melakukan pembulatan statistik tradisional dalam sains, ini adalah pembungkus yang berguna untuk membuat roundfungsi berfungsi seperti yang diharapkan membutuhkan importhal-hal tambahan seperti Decimal.
>>> round(0.075,2)
0.07
>>> round(0.075+10**(-2*6),2)
0.08
Aha! Jadi berdasarkan ini kita dapat membuat fungsi ...
def roundTraditional(val,digits):
return round(val+10**(-len(str(val))-1), digits)
Pada dasarnya ini menambahkan nilai yang sangat kecil ke string untuk memaksanya untuk mengumpulkan dengan benar pada contoh yang tidak terduga di mana ia biasanya tidak dengan roundfungsi ketika Anda mengharapkannya. Nilai yang nyaman untuk ditambahkan adalah di 1e-Xmana Xpanjang string angka yang Anda coba gunakan roundpada plus 1.
Pendekatan penggunaan 10**(-len(val)-1)itu disengaja, karena jumlah kecil terbesar yang dapat Anda tambahkan untuk memaksa perubahan, sambil juga memastikan bahwa nilai yang Anda tambahkan tidak pernah mengubah pembulatan bahkan jika desimal .hilang. Saya bisa menggunakan hanya 10**(-len(val))dengan persyaratan if (val>1)untuk mengurangi 1lebih banyak ... tapi lebih mudah untuk selalu mengurangi 1karena tidak akan banyak mengubah rentang angka desimal yang dapat diatasi dengan solusi ini. Pendekatan ini akan gagal jika nilai Anda mencapai batas tipe, ini akan gagal, tetapi untuk hampir seluruh rentang nilai desimal yang valid, itu harus bekerja.
Jadi kode yang sudah selesai akan menjadi seperti:
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()
... harus memberi Anda hasil yang Anda harapkan.
Anda juga dapat menggunakan pustaka desimal untuk mencapai hal ini, tetapi pembungkus yang saya usulkan lebih sederhana dan mungkin lebih disukai dalam beberapa kasus.
Sunting: Terima kasih Blckknght untuk menunjukkan bahwa 5kasus pinggiran hanya terjadi untuk nilai-nilai tertentu di sini .