Hala bc
bir fonksiyon içerisinde sadece bir değerin nasıl yuvarlanacağına dair kesin bir cevap arıyorum , fakat işte size saf bir bash
cevap:
#!/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**10
inç 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 $int
ve nokta sonra sayıları kaydeder $fraction
. Kesirli basamakların sayısı içinde not edilmiştir $precision
. Matematik ait birleştirme ile çarpar 10¹⁰ $int
ve $fraction
bundan sonra da (örneğin, bu hassas uyacak şekilde ayarlanır embiggen 48.86
10¹⁰ x 4886/100 ve döner hale 488600000000
488.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 $answer
bizi, 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 $int
değer atarız $answer
, daha sonra echo
bir nokta ve daha önce halledilmiş olan değer $answer
hariç 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 zsh
kayan 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.)