Rounding yang Memuaskan
Anda tahu kapan Anda berada di kelas sains, dan diminta membulatkan ke 2 buah ara, tetapi jawaban Anda adalah 5.2501...
? Anda harus membulatkan tekad 5.3
, tapi itu sangat tidak memuaskan! Dengan membulatkan ke 5.3
, Anda pergi dengan 0,05 keseluruhan, yang merupakan jumlah besar dibandingkan dengan 0,1 (nilai tempat Anda pembulatan ke)! Jadi tolong bantu saya dengan cara yang memuaskan.
Untuk membulatkan dengan cara yang memuaskan, Anda harus membulatkan angka pertama yang Anda temui yang menghasilkan kesalahan yang relatif kecil - kurang dari setengah kesalahan maksimum yang mungkin terjadi saat pembulatan. Pada dasarnya, Anda perlu membulatkan setiap kali Anda menemukan 0, 1, 8, atau 9. Jika itu tidak pernah terjadi, kembalikan input apa adanya. Jangan membulatkan angka nol di depan atau yang lainnya - yang memang tidak memuaskan.
Memasukkan
Nilai string atau float yang mewakili angka desimal non-negatif.
Keluaran
Angka desimal yang sama dibulatkan dengan memuaskan, dalam format string atau float.
Contohnya
Input -> Output
0 -> 0
0.5 -> 0.5
0.19 -> 0
0.8 -> 1
5.64511 -> 5.645
18.913 -> 20
88.913 -> 100
36.38299 -> 36.4
621 -> 620
803.22 -> 1000
547.4726 -> 547.4726
Ini adalah tantangan kode-golf , jadi kode terpendek menang!
sumber
036.40000
dianggap sebagai output yang valid?.0
bagian akan diberikan untuk bilangan bulat? Juga,0
tidak positif.19
putaran untuk20
tetapi0.19
putaran ke0
? Mengapa?Jawaban:
JavaScript (ES6),
100 99 9878 byteMengambil input sebagai string. Mengembalikan float.
Cobalah online!
Bagaimana?
Kami pertama-tama menambahkan awal0 ke string input, sehingga kami dijamin memiliki digit sebelum 8 kemungkinan memimpin8 atau 9 , yang harus memicu pembulatan segera.
Benderaj diatur ke 1 selama kita mencari digit di mana kita dapat melakukan pembulatan yang memuaskan, dan ditetapkan ke 0 setelahnya.
Karena0 terdepan ditambahkan ke string yang sedang kita lalui tetapi s dibiarkan tidak berubah, d berisi karakter saat ini dan s[i] menunjuk kekarakterberikutnya.
Kami menggunakan kode berikut untuk memuat digit berikutnyan , melompati pemisah desimal yang mungkin:
Meskipun string yang berubah dalam JavaScript, ekspresis[i]+1 jika mengandung nilai numerik, meskipun s[i] tidak benar-benar bertambah. Oleh karena itu, ekspresi false (dipaksa ke 0 ) untuk semua digit (termasuk 0 ) dan untuk true (dipaksakan ke 1 ) untuk pemisah desimal
++s[i]
akan kembali!++s[i]
dievaluasi menjadi"."
.d + --j
d + j--
sumber
Ruby ,
7977696765 byteCobalah online!
Penjelasan
->n
Ambil input sebagai stringz=n+".0"
Buat string sementaraz
yang dijamin mengandung titik dan digit yang relevan.i=z=~/\./
Tentukan posisi titik desimalz
dan tetapkani
.z[i]=''
Jatuhkan titik sehingga tidak menghalangi.z=~/(?!^)[01]|8|9/
Tentukan posisi non-start0-1
atau apa pun8-9
, mana yang lebih dulu.(...)-i
Perbedaan ini adalah jumlah tempat desimal yang akan disimpan, negatif jika kita akan membulatkan titik kiri.n.to_f.round ...
Konversikan ke float dan lakukan pembulatan.sumber
Jelly , 34 byte
Cobalah online!
-1 terima kasih kepada Jonathan Allan .
sumber
ŒV
? Saya pikirV
akan bekerja juga._>¥0ɓVær
seperti milik saya (saya melewatkan penggunaan diad cepat jadi terima kasih juga!)Jelly ,
3029 byte-1 terima kasih kepada Erik the Outgolfer (penggunaan diad cepat
¥
dari jawabannya)Tautan monadik yang menerima daftar karakter yang menghasilkan float.
Cobalah online! Atau lihat test-suite .
Bagaimana
Catatan pertama bahwa string input dibuat secara eksklusif dari karakter
0123456789.
yang memiliki tata cara[48,49,50,51,52,53,54,55,56,57,46]
, yang memiliki sisa ketika dibagi dengan delapan karakter[0,1,2,3,4,5,6,7,0,1,6]
. Satu-satunya karakter yang antara-1
dan1
inklusif yang0
,1
,8
, dan9
.Lebih jauh lagi jika kita mengurangi delapan dari ordinals (
[40,41,42,43,44,45,46,47,48,49,38]
) yang sama (cukup jelas) berlaku. Jika kita membagi dua ini ([20,20.5,21,21.5,22,22.5,23,23.5,24,24.5,19]
) satu-satunya karakter yang memiliki sisa ketika dibagi delapan yang antara-1
dan1
inklusif adalah8
dan9
.sumber
Retina 0.8.2 , 75 byte
Cobalah online! Tautan termasuk kasus uji. Penjelasan:
Tangani kasus seorang pemimpin
8
atau9
.Jika ada non-leading
0
atau1
, maka nolkan dan sisa string keluar. Juga, jika ada8
atau9
, lalu tinggalkan, tetapi nol sisa string. (Tetapi biarkan titik desimal tidak berubah dalam kedua kasus.)Jika masih ada
8
atau9
pada titik ini, maka nolkan, dan tambahkan digit sebelumnya (mungkin sebelum titik desimal).Hapus trailing nol jika mereka setelah titik desimal, tetapi hanya hapus titik desimal jika tidak ada angka lain di antaranya.
sumber
C (gcc) ,
111102 byteCobalah online!
sumber
C # (Visual C # Interactive Compiler) , 280 byte
Cobalah online!
Bisa lebih pendek jika saya menggunakan ganda daripada desimal, tapi saya menggunakan desimal untuk menjaga akurasi, atau angka seperti 547.4726 akan menjadi 547.472595214844.
C # (Visual C # Interactive Compiler) , 268 byte
Cobalah online! (Versi kurang akurat)
sumber