Bagaimana cara membulatkan nomor floating point IEEE 754 dengan benar di baris perintah?
Saya ingin menentukan ketepatan nomor keluaran - hitungan angka fraksional.
Pembulatan 6.66
ke presisi 1
harus memberi 6.7
, misalnya. Lebih banyak dalam tabel di bawah ini:
Value Precision Rounded
6.66 0 7
6.66 1 6.7
6.66 2 6.66
6.66 3 6.660
6.666 3 6.666
6.6666 3 6.667
Seharusnya bisa digunakan dalam shell interaktif, tetapi idealnya cukup kuat untuk menggunakannya dalam skrip shell produksi.
bash
command-line
arithmetic
floating-point
Volker Siegel
sumber
sumber
awk
.Jawaban:
Membulatkan angka floating point
Apa yang dimaksud dengan "membulatkan angka floating point"?
Itu mudah, jelas ... Di mana buku matematika saya dari sekolah ...
Tidak, kami sudah tahu tidak ada yang terkait dengan angka floating point mudah:
Sebagai permulaan, ada beberapa mode pembulatan:
Bagaimana cara menangani kasing sudut? Bagaimana cara mengetahui kasus sudut mana?
OK, sepertinya kita lebih baik menggunakan implementasi standar IEEE 754, dan biarkan sistem kami yang mengurusnya.
Untuk membulatkan angka floating point di shell, berdasarkan aritmatika floating point standar, kita membutuhkan tiga langkah:
Ternyata perintah shell
printf
dapat melakukan semua ini. Ini dapat digunakan untuk mencetak angka sesuai dengan spesifikasi format seperti yang dijelaskan dalamman 3 printf
. Angka-angka dibulatkan secara implisit dengan cara standar jika diperlukan untuk format output:Perintah
Membulatkan
x
kep
digit presisi dengan input sebagai argumen baris perintah:Atau dalam pipa shell, dengan input
x
pada input standar, danp
sebagai argumen:Contoh:
Perangkap buruk
Berhati-hatilah di tempat itu! Ini menentukan pemisah antara bagian integral dan fraksi -
.
seperti yang Anda harapkan.Tetapi lihat sendiri apa yang terjadi di lokal Jerman, misalnya:
Ya, benar
6,667
- enam koma enam enam tujuh. Itu pasti akan mengacaukan naskah Anda.(Tetapi hanya untuk dua pelanggan di Jerman. Kecuali untuk mesin pengembang saat ini sedang melakukan debug untuk pelanggan ini.)
Lebih kuat
Untuk membuatnya lebih kuat, gunakan:
atau
Ini juga menggunakan
/usr/bin/printf
bukannya shell yang dibangun daribash
atauzsh
untuk bekerja di sekitar inkonsistensi kecil dalam implementasiprintf
varian, dan mencegah efek yang sangat kotor ketika, di lokal Jerman,LC_ALL
diatur, tetapi tidak diekspor. Kemudian, builtin menggunakan,
, dan/usr/bin/printf
menggunakan.
...Lihat juga
%g
untuk pembulatan ke sejumlah digit signifikan.sumber
Mengikuti berhasil bagi saya.
sumber