Page 1 of 1

Grosso problema utilizzando int()

PostPosted: Thu Jul 16, 2009 8:00 am
by Marco Turco
Ho una casistica veramente particolare.
In pratica ho una variabile numerica che contiene la somma di una ventina di valori decimali.
Il risultato è 65.000000

il problema è che se faccio un int() di questa variabile per avere la sola parte intera, il risultato è 64 !!!!!

qualche idea ?

Re: Grosso problema utilizzando int()

PostPosted: Thu Jul 16, 2009 8:12 am
by pymsoft
Marco,


prova a fare la somma con Round( nValore1, 2 ) + Round( nValore2, 2 )


o

nTotale := INT( Round( nTotale, 2 ) )

Re: Grosso problema utilizzando int()

PostPosted: Thu Jul 16, 2009 9:38 am
by Marco Turco
Si, così facendo funziona. Grazie.
Ma non c'è un sistema per risolvere il problema alla radice ? Non vorrei dovermi controllare tutte le parti del programma dove uso la funzione int()

Re: Grosso problema utilizzando int()

PostPosted: Thu Jul 16, 2009 9:52 am
by pymsoft
Marco,


questo problema si verifica solo quando fai tante operazioni con valori decimali, ma non sempre, l'unica soluzione che ho trovato io è l'uso del Round()

ciao

Re: Grosso problema utilizzando int()

PostPosted: Thu Jul 16, 2009 2:39 pm
by Enrico Maria Giordano
Il problema è infatti legato all'uso della rappresentazione numerica floating-point, è ben conosciuto e purtroppo inevitabile.

EMG

Re: Grosso problema utilizzando int()

PostPosted: Thu Jul 16, 2009 5:27 pm
by Marco Turco
Perché inevitabile ? Non può essere corretta la funzione int() a livello di codice di xharbour facendogli fare un round prima di estrapolare l'intero ?
Mi sembra assurdo doverci creare una funzione intcorretto() da utilizzare al posto di int(). Se xharbour sbaglia anche il calcolo dell'intero non credo che avrà la possibilità di ampliare molto la sua platea di sviluppatori.

Re: Grosso problema utilizzando int()

PostPosted: Thu Jul 16, 2009 5:58 pm
by Enrico Maria Giordano
Non hai capito: xHarbour non sbaglia niente. Se farai la prova con qualunque altro linguaggio che utilizza i floating-point otterrai risultati analoghi (succede perfino con le calcolatrici). L'errore non è nella Int() che fa il suo dovere correttamente e sarebbe anzi un errore arrotondare il risultato internamente. Allora sì che non funzionerebbe come uno si aspetta. Invece l'errore è del programmatore che, probabilmente non conoscendo come si adoperano i floating-point, non ha effettuato gli indispensabili arrotondamenti (ma succede a tutti, perfino a me che invece conosco la problematica dei floating-point da circa 27 anni).

EMG

Re: Grosso problema utilizzando int()

PostPosted: Fri Jul 17, 2009 7:38 am
by pymsoft
Si, ma poi non è un errore che capita spesso, e purtroppo di solito, se ne accorge il cliente :-(
dopodichè, velocemente ti ricordi della funzione round() per risolvere questo problema, e non solo, alle volte neanche la funzione round funziona corretamente... e io per questo motivo uso un'altra copiata dal forum che chiamo round2() e arrotonda meglio...

cose della vita..


ciao

Re: Grosso problema utilizzando int()

PostPosted: Fri Jul 17, 2009 9:19 am
by Marco Turco
Si, anchio uso round2 (credo me l'abbia girata proprio Enrico)

Re: Grosso problema utilizzando int()

PostPosted: Fri Jul 17, 2009 9:42 am
by Enrico Maria Giordano
pymsoft wrote:Si, ma poi non è un errore che capita spesso, e purtroppo di solito, se ne accorge il cliente :-(


Vero. :-(

pymsoft wrote:alle volte neanche la funzione round funziona corretamente...


Non mi risulta. Riusciresti a fare un piccolo esempio che lo dimostri? Se c'è un problema sarebbe meglio farlo sistemare, no?

EMG

Re: Grosso problema utilizzando int()

PostPosted: Fri Jul 17, 2009 2:07 pm
by pymsoft
Enrico,

viewtopic.php?f=6&t=5679&hilit=round+error

magari hanno risolto (sicuramente) nelle versione successive di xharbour


ciao

p.s. io uso la funzione round2 da anni per questo motivo, non ho piu controllato con le nuove versioni di xharbour.

Re: Grosso problema utilizzando int()

PostPosted: Fri Jul 17, 2009 6:17 pm
by Enrico Maria Giordano
pymsoft wrote:Enrico,

viewtopic.php?f=6&t=5679&hilit=round+error

magari hanno risolto (sicuramente) nelle versione successive di xharbour


Infatti funziona perfettamente. Ti conviene abbandonare la round2().

EMG

Re: Grosso problema utilizzando int()

PostPosted: Wed Jul 22, 2009 12:18 pm
by pymsoft
ok, grazie.