Twoja sztuczka dodania 0.0005
nie jest złym pomysłem. Chociaż nie działa to w ten sposób. scale
jest używany wewnętrznie, gdy bc
wykonuje niektóre operacje (takie jak podziały).
W twoim przypadku, to byłoby lepiej, aby wykonać podział pierwsze, być może przy użyciu dużej scale
lub przełącznik -l
do bc
(jeśli wersja obsługuje go), a następnie dodać 0.0005
a następnie ustawić scale=3
i wykonują operacja z udziałem scale
wewnętrznie w celu wykonania obcięcia.
Coś jak:
`a=$sum/$n+0.0005; scale=3; a/1`
Oczywiście, będziemy chcieli, aby postępować inaczej, czy sum
jest dodatnia lub ujemna. Na szczęście bc
ma kilka operatorów warunkowych.
`a=$sum/$n; if(a>0) a+=0.0005 else if (a<0) a-=0.0005; scale=3; a/1`
Następnie należy sformatować tę odpowiedź za pomocą printf
.
Owinięty w funkcji round
(gdzie opcjonalnie można wybrać ilość liczb po przecinku):
round() {
# $1 is expression to round (should be a valid bc expression)
# $2 is number of decimal figures (optional). Defaults to three if none given
local df=${2:-3}
printf '%.*f\n' "$df" "$(bc -l <<< "a=$1; if(a>0) a+=5/10^($df+1) else if (a<0) a-=5/10^($df+1); scale=$df; a/1")"
}
Wypróbuj go:
gniourf$ round "(3+3+4)/3"
3.333
gniourf$ round "(3+3+5)/3"
3.667
gniourf$ round "-(3+3+5)/3"
-3.667
gniourf$ round 0
0.000
gniourf$ round 1/3 10
0.3333333333
gniourf$ round 0.0005
0.001
gniourf$ round 0.00049
0.000
z przełącznikiem -l
, scale
jest ustawiony na 20
, co powinno wystarczyć.
Ty dodanie '0.0005', więc' bc' chętnie odpowie z 4 cyfr po przecinku. –
Co więc powinienem zrobić? –
Co powiesz na usunięcie '+ 0.0005'? –