ciao,
spero con questo titolo di attirare l'attenzione di molta gente, per farvi partecipi del problema in cui mi sono imbatutto.
vi spiego il problema che dovevo risolvere:
ho realizzato un'applicativo per una catena di negozi, a poco tempo fa con il titolare dell'azienda stavamo progettando gli algoritmi di calcolo per la sua prossima "fidelity card"... e fin qui tutto bene, mettiamo tutto su carta, programmiamo il da farsi, dopodichè mi metto al pc.
prima regola di questa fidelity, il cliente ha diritto a guadagnare X punti ogni 10,00 € di spesa.
esempio:
100 € = (10 * X) pti
105 € = (10 * X) pti
109 € = (10 * X) pti
la necessità quindi è quella di dividere il totale dello scontrino per 10, togliere i decimali senza però effettuare arrotondamenti per eccesso e moltiplicare per X per calcolare il giusto numero di punti da attibuire.
una cosa elementare penso io....
faccio subito una funzione che è la seguente:
in questo caso il nostro X è 3 tanto per fare una prova...
qual'è stato il mio ragionamento...
divido il totale dello scontrino per 10, sottraggo 0.5 e trasformo in integer con la cara vecchia funzione cInt()
per quelli a cui non è chiaro, spiego perchè sottraggo 0.5 dal risultato della divisione...
totale scontrino | ris. divisione | arr. normale | -0.5 arrotondato |
100,00 € | 10,00 | 10 | 9.5 -> 10 |
199,99 € | 19,99 | 20 | 19.49 -> 19 |
213,00 € | 21,30 | 21 | 20.80 -> 20 |
quindi sottrarre 0,5 al risultato della divisione mi permette in ogni caso di eliminare l'arrotondamento per eccesso.
dov'è il problema?!?!!?
ecco un po di esempi:
499:10=49,9
tolgo 0.5 per arrotondare sempre per difetto = 49,4
arrotondo a numero intero = 49
moltiplico x 3 e trovo il punteggio = 147
199:10=19,9
tolgo 0.5 per arrotondare sempre per difetto = 19,4
arrotondo a numero intero = 19
moltiplico x 3 e trovo il punteggio = 57
110:10=11
tolgo 0.5 per arrotondare sempre per difetto = 10,5
arrotondo a numero intero = 10 <------ ERRORE
moltiplico x 3 e trovo il punteggio = 30
la funzione cInt() in barba alle leggi matematiche, arrotonda il X,5 per difetto invece che per eccesso!!!!!
http://it.wikipedia.org/wiki/Arrotondamento
per ora ho risolto sottraendo 0,49999999999 anzichè 0,5 ma non mi pare la soluzione più elegante del pianeta, se avete delle idee... grazie e Buon Natale a tutti/e
----------------------------------------------------------------------
http://www.flashinlabs.biz o .com o .net o .it fate voi :P