GNU/Linux >> Znalost Linux >  >> Linux

Zaokrouhlování čísel s bc v Bash

Další funkce zaokrouhlí argument 'x' na 'd' číslice:

define r(x, d) {
    auto r, s

    if(0 > x) {
        return -r(-x, d)
    }
    r = x + 0.5*10^-d
    s = scale
    scale = d
    r = r*10/10
    scale = s  
    return r
} 

Váš trik, jak přidat 0.0005 není špatný nápad. I když, ono to tak úplně nefunguje. scale se používá interně, když bc provádí některé operace (např. dělení).

Ve vašem případě by bylo lepší nejprve provést rozdělení, možná pomocí velkého scale nebo -l přepněte na bc (pokud to vaše verze podporuje), přidejte 0.0005 a poté nastavte scale=3 a proveďte operaci zahrnující scale interně, aby bylo zkrácení provedeno.

Něco jako:

`a=$sum/$n+0.0005; scale=3; a/1`

Samozřejmě budete chtít postupovat jinak, ať už sum je pozitivní nebo negativní. Naštěstí bc má některé podmíněné operátory.

`a=$sum/$n; if(a>0) a+=0.0005 else if (a<0) a-=0.0005; scale=3; a/1`

Tuto odpověď pak budete chtít naformátovat pomocí printf .

Zabalené ve funkci round (kde můžete volitelně vybrat počet desetinných míst):

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")"
}

Zkuste to:

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

s -l přepínač, scale je nastaven na 20 , což by mělo bohatě stačit.


Toto řešení není tak flexibilní (jen převádí float na int), ale dokáže si poradit se zápornými čísly:

e=$( echo "scale=0; (${e}+0.5)/1" | bc -l )
if [[ "${e}" -lt 0 ]] ; then
    e=$(( e - 1 ))
fi

Linux
  1. Bash -c s pozičními parametry?

  2. Zaokrouhlete dělené číslo v bash

  3. Historie Bash bez čísel řádků

  1. Bash pole s příklady

  2. Třídění čísel s více desetinnými místy v bash

  3. Nula vyplňte čísla na 2 číslice se sed

  1. Bash If-Else prohlášení s příklady

  2. Alias ​​s proměnnou v bash

  3. základní jméno s mezerami ve skriptu bash?