Hala bcbir fonksiyon içerisinde sadece bir değerin nasıl yuvarlanacağına dair kesin bir cevap arıyorum , fakat işte size saf bir bashcevap:
#!/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..."
Temel olarak, bu, ondalık sayıları dikkatlice ayıklar, her şeyi 100 milyar (10¹⁰, 10**10inç bash) ile çarpar , hassasiyet ve yuvarlama için ayarlar, asıl bölmeyi gerçekleştirir, uygun büyüklüğe geri böler ve ardından ondalık sayıyı yeniden yerleştirir.
Adım adım:
embiggen()Fonksiyon atar onun argüman şeklinde tamsayı kesildi $intve nokta sonra sayıları kaydeder $fraction. Kesirli basamakların sayısı içinde not edilmiştir $precision. Matematik ait birleştirme ile çarpar 10¹⁰ $intve $fractionbundan sonra da (örneğin, bu hassas uyacak şekilde ayarlanır embiggen 48.8610¹⁰ x 4886/100 ve döner hale 488600000000488.600.000.000 olan).
Yüzde yüzlerce kesin bir hassasiyet istiyoruz, bu yüzden ilk sayıyı 100'le çarpıyoruz, yuvarlama amacıyla 5 ekliyoruz ve ardından ikinci sayıyı bölüyoruz. Bu ödev $answerbizi, son cevabın yüz katı olarak bırakır.
Şimdi ondalık basamağı eklememiz gerekiyor. Son iki basamağını hariç tutmak için yeni bir $intdeğer atarız $answer, daha sonra echobir nokta ve daha önce halledilmiş olan değer $answerhariç tutulur $int. (Bunu bir yorum gibi görünmesini sağlayan sözdizimi vurgulama hatasını boşver)
(Bashism: üstelleştirme POSIX değil, bu bir faşizmdir. Saf bir POSIX çözümü, on'un yetkilerini kullanmak yerine sıfır eklemek için döngüler gerektirir. Ayrıca, "embiggen" mükemmel bir renklendirici kelimedir.)
Kabuğum olarak kullanmamın en önemli sebeplerinden biri zshkayan nokta matematiğini desteklemesi. Bu sorunun çözümü oldukça basittir zsh:
printf %.2f $((float/1.18))
(Kayan nokta aritmetiğini etkinleştirmek için birisinin bu cevaba bir yorum eklediğini görmeyi çok isterdim bash, ancak böyle bir özelliğin henüz bulunmadığından eminim.)