• This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Leggi altro.

Arrotondare un numero

x11start

Utente Standard
Professione: Disegnatore prefabbricati
Software: Autocad
Regione: Piemonte
#1
Volendo arrotondare un numero all'intero non è un problema: basta sommarci il valore 0.5 e poi con FIX scartare la parte dopo la virgola. In questo modo i valori che superano 0.5 passano al valore superiore (es. 6.6 + 0.5 = 7.1 -> 7) mentre i valori inferiori ... (es. 6.1 + 0.5 = 6.6 -> 6).

Il problema sorge quando si vuole arrotondare .... allo 0.5.
Io ho trovato questo algoritmo:
(/ (* (fix (/ (* (atof (rtos numero 2 1)) 10) (float passo))) (float passo)) 10)

Questo consente di trasformare i numeri con la virgola fino a 0.49999 a 0.0; mentre quelli da 0.5 in poi diventano 1.0


Questa è la sub completa:
;
;----------------------
; ARROTONDAMENTO
;----------------------
;
; Numero Numero da arrotondare (es. 4.3546)
; Passo valore di arrotondamento (es. 5 -> 0.5) (reale o intero: float trasf. sempre in reale)
;
; Output:
;
; Narro Numero arrotondato (es da 4.0 a 4.4 -> 4.0 - da 4.5 a 5.0 -> 5.0 con Passo=5)
;
(defun ARROTONDA (numero passo)
(setq narro (/ (* (fix (/ (* (atof (rtos numero 2 1)) 10) (float passo))) (float passo)) 10))
)


Mi piacerebbe trovare un algoritmo in grado di "Spaccare in 2 il capello" cioè
fare:
da 0.0 a 0.24 -> 0.0
da 0.25 a 0.74 -> 0.5
da 0.75 in su -> 1.0

C'è qualcuno in grado di aiutarmi?
 

rpor66

Utente Standard
Professione: Programmatore
Software: AutoCad, GstarCAD, CadWorx, Excel, Lisp, VBA
Regione: Sicilia
#2
Arrotonda un numero N con base Delta
(defun Arrotonda (N Delta)
(setq a (* Delta (fix (+ 0.49 (/ n Delta)))))
)

quello che serve a te fallo con l'istruzione COND

Ciao
 

x11start

Utente Standard
Professione: Disegnatore prefabbricati
Software: Autocad
Regione: Piemonte
#4
Se può servire a qualcuno, ecco la routine di arrotondamento:

;
;----------------------
; 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)
(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)
)