Bagaimana saya bisa membulatkan angka desimal (titik mengambang) ke bilangan bulat terdekat?
misalnya
1.2 = 1
1.7 = 2
sumber
Bagaimana saya bisa membulatkan angka desimal (titik mengambang) ke bilangan bulat terdekat?
misalnya
1.2 = 1
1.7 = 2
Output dari perldoc -q round
Apakah Perl memiliki fungsi round ()? Bagaimana dengan ceil () dan floor ()? Fungsi trigonometri?Ingatlah bahwa
int()
hanya memotong ke arah0
. Untuk pembulatan ke angka tertentu,sprintf()
atauprintf()
biasanya rute termudah.
printf("%.3f", 3.1415926535); # prints 3.142
The
POSIX
modul (bagian dari distribusi Perl standar) menerapkanceil()
,floor()
dan sejumlah fungsi matematika dan trigonometri lainnya.
use POSIX; $ceil = ceil(3.5); # 4 $floor = floor(3.5); # 3
Dalam 5.000 hingga 5.003 perl, trigonometri dilakukan dalam
Math::Complex
modul. Dengan 5.004,Math::Trig
modul (bagian dari distribusi Perl standar) mengimplementasikan fungsi trigonometri. Secara internal ia menggunakanMath::Complex
modul dan beberapa fungsi dapat keluar dari sumbu nyata ke bidang kompleks, misalnya sinus terbalik 2.Pembulatan dalam aplikasi keuangan dapat memiliki implikasi serius, dan metode pembulatan yang digunakan harus ditentukan secara tepat. Dalam kasus ini, mungkin membayar untuk tidak mempercayai pembulatan sistem mana pun yang digunakan oleh Perl, tetapi untuk mengimplementasikan fungsi pembulatan yang Anda butuhkan sendiri.
Untuk mengetahui alasannya, perhatikan bagaimana Anda masih akan memiliki masalah tentang pergantian setengah jalan:
for ($i = 0; $i < 1.01; $i += 0.05) { printf "%.1f ",$i} 0.0 0.1 0.1 0.2 0.2 0.2 0.3 0.3 0.4 0.4 0.5 0.5 0.6 0.7 0.7 0.8 0.8 0.9 0.9 1.0 1.0
Jangan salahkan Perl. Itu sama dengan di C. IEEE mengatakan kita harus melakukan ini. Bilangan perl yang nilai absolutnya adalah bilangan bulat di bawah
2**31
(pada mesin 32 bit) akan berfungsi seperti bilangan bulat matematika. Nomor lain tidak dijamin.
printf
jika Anda ingin hasil dalam variabel, gunakansprintf
... harap ini menghemat waktu debugging :-Pint()
PDL?Meskipun tidak setuju dengan jawaban kompleks tentang tanda setengah jalan dan seterusnya, untuk kasus penggunaan yang lebih umum (dan mungkin sepele):
my $rounded = int($float + 0.5);
MEMPERBARUI
Jika Anda
$float
mungkin negatif, variasi berikut akan menghasilkan hasil yang benar:my $rounded = int($float + $float/abs($float*2 || 1));
Dengan perhitungan ini, -1.4 dibulatkan menjadi -1, dan -1.6 hingga -2, dan nol tidak akan meledak.
sumber
Anda bisa menggunakan modul seperti Math :: Round :
Atau Anda bisa melakukannya dengan cara kasar:
sumber
Jika Anda memutuskan untuk menggunakan printf atau sprintf, perhatikan bahwa mereka menggunakan metode Round half to even .
sumber
Lihat perldoc / perlfaq :
sumber
Anda tidak memerlukan modul eksternal apa pun.
Saya mungkin kehilangan poin Anda, tetapi saya pikir ini adalah cara yang jauh lebih bersih untuk melakukan pekerjaan yang sama.
Apa yang dilakukan adalah menelusuri setiap angka positif dalam elemen, mencetak angka dan bilangan bulat bulat dalam format yang Anda sebutkan. Kode ini menyatukan masing-masing bilangan bulat positif bulat hanya berdasarkan desimal. int ($ _) pada dasarnya membulatkan angka jadi ($ -int ($ )) menangkap desimal. Jika desimalnya (menurut definisi) benar-benar kurang dari 0,5, bulatkan jumlahnya. Jika tidak, bulatkan dengan menambahkan 1.
sumber
Berikut ini akan membulatkan angka positif atau negatif ke posisi desimal yang diberikan:
sumber
Berikut ini adalah contoh lima cara berbeda untuk merangkum nilai. Yang pertama adalah cara naif untuk melakukan penjumlahan (dan gagal). Upaya kedua untuk digunakan
sprintf()
, tetapi juga gagal. Penggunaan ketigasprintf()
berhasil sementara dua terakhir (4 & 5) digunakanfloor($value + 0.5)
.Catatan yang
floor($value + 0.5)
dapat diganti denganint($value + 0.5)
untuk menghapus ketergantunganPOSIX
.sumber
Angka negatif dapat menambahkan beberapa kebiasaan yang perlu diperhatikan orang.
printf
Pendekatan gaya memberi kita angka yang benar, tetapi mereka dapat menghasilkan beberapa tampilan aneh. Kami telah menemukan bahwa metode ini (menurut saya, bodoh) memberi-
tanda apakah harus atau tidak seharusnya. Misalnya, -0,01 dibulatkan ke satu tempat desimal mengembalikan -0,0, bukan hanya 0. Jika Anda akan melakukanprintf
pendekatan gaya, dan Anda tahu Anda ingin tidak ada desimal, gunakan%d
dan tidak%f
(ketika Anda membutuhkan desimal, saat itulah tampilan menjadi miring).Meskipun benar dan untuk matematika bukan masalah besar, untuk tampilan itu hanya terlihat aneh menunjukkan sesuatu seperti "-0.0".
Untuk metode int, angka negatif dapat mengubah apa yang Anda inginkan sebagai hasilnya (meskipun ada beberapa argumen yang dapat membuatnya benar).
The
int + 0.5
menyebabkan masalah nyata dengan nomor -negatif, kecuali jika Anda ingin bekerja seperti itu, tapi aku membayangkan kebanyakan orang tidak. -0,9 mungkin harus dibulatkan menjadi -1, bukan 0. Jika Anda tahu bahwa Anda ingin negatif menjadi langit-langit daripada lantai maka Anda dapat melakukannya dalam satu-liner, jika tidak, Anda mungkin ingin menggunakan metode int dengan minor modifikasi (ini jelas hanya berfungsi untuk mendapatkan kembali bilangan bulat:sumber
Solusi saya untuk sprintf
sumber
Jika Anda hanya peduli untuk mendapatkan nilai integer dari angka floating point keseluruhan (yaitu 12347.9999 atau 54321.0001), pendekatan ini (dipinjam dan dimodifikasi dari atas) akan melakukan trik:
sumber
banyak membaca dokumentasi tentang cara membulatkan angka, banyak ahli menyarankan untuk menulis rutinitas pembulatan Anda sendiri, karena versi 'kalengan' yang disediakan dengan bahasa Anda mungkin tidak cukup tepat, atau mengandung kesalahan. Saya membayangkan, bagaimanapun, mereka berbicara banyak tempat desimal bukan hanya satu, dua, atau tiga. dengan itu dalam pikiran, inilah solusi saya (walaupun tidak PERSIS seperti yang diminta karena kebutuhan saya untuk menampilkan dolar - prosesnya tidak jauh berbeda, meskipun).
sumber
if ($digit3 >= 5) { $digit3 = 0; $digit2++; if ($digit2 > 9) { $digit2 = 0; $digit1++; if ($digit1 > 9) { $digit1 = 0; $cost[0]++; } } }
jadi:if ($digit1 >= 5) { $digit1 = 0; $cost[0]++; }
kemudian sajareturn commafied($cost[0]);
sumber