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 round
fungsi berfungsi seperti yang diharapkan membutuhkan import
hal-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 round
fungsi ketika Anda mengharapkannya. Nilai yang nyaman untuk ditambahkan adalah di 1e-X
mana X
panjang string angka yang Anda coba gunakan round
pada 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 1
lebih banyak ... tapi lebih mudah untuk selalu mengurangi 1
karena 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 5
kasus pinggiran hanya terjadi untuk nilai-nilai tertentu di sini .