Saya masih mencari bcjawaban murni untuk cara membulatkan hanya satu nilai dalam suatu fungsi, tapi inilah bashjawaban murni :
#!/bin/bash
echo "Insert the price you want to calculate:"
read float
echo "This is the price without taxes:"
embiggen() {
local int precision fraction=""
if [ "$1" != "${1#*.}" ]; then # there is a decimal point
fraction="${1#*.}" # just the digits after the dot
fi
int="${1%.*}" # the float as a truncated integer
precision="${#fraction}" # the number of fractional digits
echo $(( 10**10 * $int$fraction / 10**$precision ))
}
# round down if negative
if [ "$float" != "${float#-}" ]
then round="-5000000000"
else round="5000000000"
fi
# calculate rounded answer (sans decimal point)
answer=$(( ( `embiggen $float` * 100 + $round ) / `embiggen 1.18` ))
int=${answer%??} # the answer as a truncated integer
echo $int.${answer#$int} # reassemble with correct precision
read -p "Press any key to continue..."
Pada dasarnya, ini dengan hati-hati mengekstraksi desimal, mengalikan semuanya dengan 100 miliar (10¹⁰, 10**10dalam bash), menyesuaikan presisi dan pembulatan, melakukan pembagian aktual, membagi kembali ke besaran yang sesuai, dan kemudian memasukkan kembali desimal.
Selangkah demi selangkah:
The embiggen()ditunjuk fungsi dipotong bulat bentuk argumen untuk $intdan menyimpan nomor setelah titik di $fraction. Jumlah digit fraksional dicatat dalam $precision. Matematika dikalikan 10¹⁰ dengan gabungan dari $intdan $fractionkemudian menyesuaikannya agar sesuai dengan presisi (misalnya embiggen 48.86menjadi 10¹⁰ × 4886/100 dan menghasilkan 488600000000488.600.000.000).
Kami menginginkan ketepatan akhir dari seratus, jadi kami gandakan angka pertama dengan 100, tambahkan 5 untuk tujuan pembulatan, dan kemudian bagi angka kedua. Tugas ini $answermembuat kita seratus kali jawaban terakhir.
Sekarang kita perlu menambahkan titik desimal. Kami menetapkan $intnilai baru untuk $answermengecualikan dua digit terakhirnya, lalu echodengan titik dan $answertidak termasuk $intnilai yang sudah diurus. (Jangankan bug yang menyoroti sintaksis yang membuat ini tampak seperti komentar)
(Bashism: exponentiation bukan POSIX, jadi ini adalah bashism. Solusi POSIX murni akan membutuhkan loop untuk menambahkan nol daripada menggunakan kekuatan sepuluh. Juga, "embiggen" adalah kata yang sangat cromulant.)
Salah satu alasan utama yang saya gunakan zshsebagai shell saya adalah bahwa ia mendukung matematika floating point. Solusi untuk pertanyaan ini cukup mudah di zsh:
printf %.2f $((float/1.18))
(Saya ingin melihat seseorang menambahkan komentar pada jawaban ini dengan trik untuk mengaktifkan aritmatika floating point bash, tetapi saya cukup yakin bahwa fitur seperti itu belum ada.)