Successivo: , Precedente: , Su: Funzioni di tipo generale   [Contenuti][Indice]


10.2.3 Arrotondamento di numeri

Il modo in cui printf e sprintf() (vedi la sezione Usare l’istruzione printf per stampe sofisticate) effettuano l’arrotondamento spesso dipende dalla subroutine C sprintf() del sistema. Su molte macchine, l’arrotondamento di sprintf() è statistico, il che significa che non sempre arrotonda un .5 finale per eccesso, contrariamente alle normali aspettative. Nell’arrotondamento statistico, .5 arrotonda alla cifra pari, anziché sempre per eccesso, così 1.5 arrotonda a 2 e 4.5 arrotonda a 4. Ciò significa che se si sta usando un formato che fa arrotondamenti (p.es. "%.0f"), si dovrebbe controllare quello che fa il sistema che si sta usando. La seguente funzione esegue un arrotondamento tradizionale; potrebbe essere utile nel caso in cui l’istruzione printf di awk che si sta usando faccia degli arrotondamenti statistici:

# round.awk --- effettua arrotondamento tradizionale

function round(x,   ival, aval, frazione)
{
   ival = int(x)    # parte intera, int() fa un troncamento

   # vedere se c'è la parte frazionale
   if (ival == x)   # nessuna parte frazionale
      return ival   # nessun decimale

   if (x < 0) {
      aval = -x     # valore assoluto
      ival = int(aval)
      frazione = aval - ival
      if (frazione >= .5)
         return int(x) - 1   # -2.5 --> -3
      else
         return int(x)       # -2.3 --> -2
   } else {
      frazione = x - ival
      if (frazione >= .5)
         return ival + 1
      else
         return ival
   }
}
# codice per testare, commentato
# { print $0, round($0) }