bc: mengatur jumlah digit setelah titik desimal

52

bc menangani angka sebagai bilangan bulat:

# echo "100/3" | bc
33

bc -l menangani angka sebagai objek titik mengambang:

# echo "100/3" | bc -l
33.33333333333333333333

Apakah ada cara untuk membatasi jumlah digit setelah titik desimal?

Adam Matan
sumber
10
Menariknya, ini hanya bekerja dengan divisi. Jika Anda ingin melakukannya scale=0;1234*1.1, Anda harus menuliskannya scale=0;1234*1.1/1untuk mendapatkannya 1357. Jika tidak, berapa pun nilainya scale, Anda dapatkan 1357.4.
Wok
Tidakkah komentar @Wok berada pada jawaban yang diterima, bukan pada pertanyaan? Sampai saya membaca jawabannya, saya tidak tahu apa yang dimaksud dengan komentar ini.
Wilson F
1
@ WillsonF Menambahkan referensi ke jawabannya.
Adam Matan
2
@ Wow, itu tidak tergantung pada divisi atau perkalian. Tergantung pada input - angka presisi terbesar menentukan presisi dalam output. Perhatikan bagaimana 1234*1.0Anda memberi1234.0
Richlv

Jawaban:

71

Setel scalevariabel khusus:

$ echo "scale=2; 100/3" | bc
33.33
kronis
sumber
3
Lihat komentar @ Wok ​​pada pertanyaan.
Adam Matan
$ echo "scale=2; (100/180)*180" | bcmemberikan 99,00 :(
Donatas Olsevičius
@ DonatasOlsevičius ini karena (100/180) = 0,55 dan kemudian (0,55 * 180) = 99. Jadi itu memberi Anda nilai yang tepat :)
Kamaldeep singh Bhatia
Akan lebih baik jika dibulatkan ke atas .5. ~$ echo "scale=2; 12/104" | bc .11 Jika dibulatkan ini akan menjadi .12. Namun, itu masih harus melakukan pekerjaan untuk tugas saya.
jbrock
3
Anda dapat mempertahankan presisi sampai mencetak nilai dengan cara ini: echo "result = (100/180) * 180; scale=2; result / 1" | bc -l. Sekarang kamu mengerti 99.99.
Byron Hawkins
11

scalehanya berfungsi untuk divisi; jika beberapa geek membutuhkannya dalam perkalian, maka Anda dapat melakukannya dengan menggunakan manipulasi string. Katakan jika Anda perlu memperbanyak 32 * 0.60, jawabannya adalah 19.20. Jika Anda perlu mendapatkannya sendiri 19 sebagai jawaban Anda bisa mendapatkannya dengan metode yang berbeda.

  1. Menggunakan Manipulasi String

    $ S=$(echo "32*.60" | bc ) ; echo ${S%.*}
    19
    

    Sintaks Manipulasi String:, ${Variable%pattern}ini akan menghapus pola pencocokan pendek yang muncul setelahnya %. Untuk detail manipulasi string lebih lanjut, lihat Panduan Script Bash Lanjutan .

  2. Menggunakan Scaleseperti yang dinyatakan oleh**chronitis**

    $ echo "scale=0; 32*60/100" | bc
    19
    
  3. Untuk menghilangkan trailing 0s, alih-alih manipulasi string, kita juga bisa melakukan pembagian dengan 1.

    $ echo "0.232 * 1000" | bc
    232.000
    
    $ echo "0.232 * 1000 / 1" | bc
    232
    
SAGAR Nair
sumber
Perhatikan bahwa, seperti yang saya sebutkan di komentar saya pada pertanyaan, itu bukan disebabkan oleh perkalian, tetapi lebih karena nomor input memiliki bagian desimal. Atau, dengan kata lain, angka dengan bagian desimal "terpanjang" akan menentukan berapa banyak tempat desimal yang akan dihasilkan.
Richlv
4

Selain jawaban sebelumnya

echo "scale=2; 1.0150876" | bc

Kembali

1.0150876

Tambahkan operasi Matematika untuk mendapatkan hanya 2 angka desimal - (NUMBER * 100) / 100

echo "scale=2; (1.0150876 * 100) / 100" | bc

Sekarang kembali

1.01
Michal Zmuda
sumber
3

Anda juga dapat menggunakan perintah printf untuk membulatkan hasil hingga 3 desimal

# printf "%.3f\n" $(echo "100/3" | bc -l)
3.333
Rohit Khune
sumber
2

Membulatkan

scale = 2 memotong jawaban untuk dua digit desimal, tetapi kita dapat mencapai pembulatan seperti:

$ echo "a=12/104; scale=2; (a+0.005)/1" | bc -l
.12
tampan
sumber