Saya masih mencari bc
jawaban murni untuk cara membulatkan hanya satu nilai dalam suatu fungsi, tapi inilah bash
jawaban 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**10
dalam 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 $int
dan menyimpan nomor setelah titik di $fraction
. Jumlah digit fraksional dicatat dalam $precision
. Matematika dikalikan 10¹⁰ dengan gabungan dari $int
dan $fraction
kemudian menyesuaikannya agar sesuai dengan presisi (misalnya embiggen 48.86
menjadi 10¹⁰ × 4886/100 dan menghasilkan 488600000000
488.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 $answer
membuat kita seratus kali jawaban terakhir.
Sekarang kita perlu menambahkan titik desimal. Kami menetapkan $int
nilai baru untuk $answer
mengecualikan dua digit terakhirnya, lalu echo
dengan titik dan $answer
tidak termasuk $int
nilai 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 zsh
sebagai 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.)