Arrotondamento alla seconda cifra decimale

Angelo2449

Utente Junior
Professione: Pensionato
Software: Autocad
Regione: Lombardia
#1
Salve a tutti,
sono alle prese con l'arrotondamento dei numeri alla seconda cifra decimale per comporre una tabella.
Non riesco a far coincidere gli addendi con la loro somma a causa degli arrotondamenti, cji ha una bella routine?
Grazie.
 

x11start

Utente Standard
Professione: Disegnatore prefabbricati
Software: Autocad
Regione: Piemonte
#2
Se il problema é quello di verificare se due numeri sono (quasi) uguali: cioé se lo sono solo per i primi decimali, puoi confrontarli con (equal espr1 espr2 approssimazione)
es.se espr1 = 1.123456 espr2=1.123457
(equal espr1 espr2) restituisce Nil
(equal espr1 espr2 0.000001) restituisce T.
se invece il tuo intento é proprio quello di fare un arrotondamento occorre sommare 0.005 e confrontarlo con il n non sommato (prendendo solo 2 cifre dopo la virgola). Se i due numeri risultano uguali significa che lo 0.005 sommato non ha avuto un riporto e quindi significa che il numero aveva un numero inferiore al 5 alla 2 cifra decim. (es. 0.023 + 0.005 = 0.028 (il 2 non é diventato 3).
Spero di essermi spiegato.
 

Angelo2449

Utente Junior
Professione: Pensionato
Software: Autocad
Regione: Lombardia
#3
Grazie x11start, seguendo il tuo consiglio, ho scritto questo codice che converte un numero reale in una stringa formattata con due decimali arrotondati al 5.
Inoltre aggiunge gli zeri mancanti, funziona benissimo!
Forse non è il massimo dello stile ma, come si dice, squadra vincente non si cambia.
Tuttavia sarebbe interessante apportare al codice miglioramenti anche stilistici.
Grazie
Codice:
(defun FORMATTA (/ NumeroX Intero Fraz InteroS FrazS Primo Secondo Terzo TerzoN SecondoN NumeroS)

    (setq NumeroX AreaX)  

    (setq Intero (fix NumeroX))
    (setq Fraz (- NumeroX Intero))

    (setq InteroS (itoa Intero))
    (setq FrazS (rtos Fraz))
    (setq FrazS (substr FrazS 3 3))

    (setq Primo (substr FrazS 1 1))
    (setq Secondo (substr FrazS 2 1))
    (setq Terzo (substr FrazS 3 1))

        (setq TerzoN (atoi Terzo))

    (if (>= TerzoN 5)
        (setq SecondoN (1+ (atoi Secondo)))
        (setq SecondoN (atoi Secondo))
    );;if

    (setq SecondoS (itoa SecondoN))
    (setq SecondoS (substr SecondoS 1 1))

    (setq NumeroS (strcat InteroS "." Primo SecondoS))

    (setq AreaY NumeroS)

    );;defun fine FORMATTA
 

x11start

Utente Standard
Professione: Disegnatore prefabbricati
Software: Autocad
Regione: Piemonte
#4
Per arrotondare (alla 1° cifra dopo la virgola e non alla seconda.... ma cambia poco) io uso:

;
;----------------------
; ARROTONDAMENTO
;----------------------
;
; Input :
; Numero Numero da arrotondare (es. 4.35)
;
; Output:
; Narro Numero arrotondato (es. 4.5)
;
;
; L'arrotondamento avviene secondo i seguenti criteri:
;
; da 0.00 a 0.24 -> 0.0
; da 0.25 a 0.74 -> 0.5
; da 0.75 a 1.0 -> 1.0
;
;
(defun ARROTONDA (numero / intero virgola arrot)
(setq intero (fix numero)) ; Numero intero
(setq virgola (- numero intero)) ; Parte dopo la virgola
(cond
((< virgola 0.25)(setq arrot 0.0)) ; Se < di 0.25 arrotonda a 0.0 (per difetto)
((and (>= virgola 0.25)(< virgola 0.75))(setq arrot 0.5)); arrot. a 0.5 (a metà)
(T (setq arrot 1.0)) ; Altrimenti arrotonda a 1.0 (per eccesso)
)
(setq narro (+ intero arrot)) ; Ricompone il numero (intero + parte arrotondata)
)
;
 

rpor66

Utente Standard
Professione: Programmatore
Software: AutoCad, GstarCAD, CadWorx, Excel, Lisp, VBA
Regione: Sicilia
#5
Io uso queste 2 funzioni per gestire i decimali

; funzione per arrotondare un Numero con base Delta
(defun Arrotonda (N Delta)
(* Delta (fix (+ (/ n Delta) 0.49)))
)

; funzione che taglia i decimali
(defun FixNum(num dec / molti)
(setq molti (expt 10.0 dec))
(/ (fix (* num molti)) molti)
)

(arrotonda 1.45689 0.01) ritorna 1.46
(arrotonda 1.45423 0.01) ritorna 1.45
(fixnum 1.45689 1) ritorna 1.4
(fixnum 1.45689 2) ritorna 1.45
(fixnum 1.45689 3) ritorna 1.456