Grosso problema utilizzando int()

Moderator: Enrico Maria Giordano

Post Reply
User avatar
Marco Turco
Posts: 858
Joined: Fri Oct 07, 2005 12:00 pm
Location: London
Contact:

Grosso problema utilizzando int()

Post 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 ?
Best Regards,

Marco Turco
SOFTWARE XP LLP
User avatar
pymsoft
Posts: 383
Joined: Tue Oct 11, 2005 1:01 pm
Location: Savona - Italia
Contact:

Re: Grosso problema utilizzando int()

Post by pymsoft »

Marco,


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


o

nTotale := INT( Round( nTotale, 2 ) )
Pedro Gonzalez
User avatar
Marco Turco
Posts: 858
Joined: Fri Oct 07, 2005 12:00 pm
Location: London
Contact:

Re: Grosso problema utilizzando int()

Post 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()
Best Regards,

Marco Turco
SOFTWARE XP LLP
User avatar
pymsoft
Posts: 383
Joined: Tue Oct 11, 2005 1:01 pm
Location: Savona - Italia
Contact:

Re: Grosso problema utilizzando int()

Post 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
Pedro Gonzalez
User avatar
Enrico Maria Giordano
Posts: 7355
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia
Contact:

Re: Grosso problema utilizzando int()

Post by Enrico Maria Giordano »

Il problema è infatti legato all'uso della rappresentazione numerica floating-point, è ben conosciuto e purtroppo inevitabile.

EMG
User avatar
Marco Turco
Posts: 858
Joined: Fri Oct 07, 2005 12:00 pm
Location: London
Contact:

Re: Grosso problema utilizzando int()

Post 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.
Best Regards,

Marco Turco
SOFTWARE XP LLP
User avatar
Enrico Maria Giordano
Posts: 7355
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia
Contact:

Re: Grosso problema utilizzando int()

Post 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
User avatar
pymsoft
Posts: 383
Joined: Tue Oct 11, 2005 1:01 pm
Location: Savona - Italia
Contact:

Re: Grosso problema utilizzando int()

Post 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
Pedro Gonzalez
User avatar
Marco Turco
Posts: 858
Joined: Fri Oct 07, 2005 12:00 pm
Location: London
Contact:

Re: Grosso problema utilizzando int()

Post by Marco Turco »

Si, anchio uso round2 (credo me l'abbia girata proprio Enrico)
Best Regards,

Marco Turco
SOFTWARE XP LLP
User avatar
Enrico Maria Giordano
Posts: 7355
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia
Contact:

Re: Grosso problema utilizzando int()

Post 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
User avatar
pymsoft
Posts: 383
Joined: Tue Oct 11, 2005 1:01 pm
Location: Savona - Italia
Contact:

Re: Grosso problema utilizzando int()

Post by pymsoft »

Enrico,

http://forums.fivetechsupport.com/viewt ... ound+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.
Pedro Gonzalez
User avatar
Enrico Maria Giordano
Posts: 7355
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia
Contact:

Re: Grosso problema utilizzando int()

Post by Enrico Maria Giordano »

pymsoft wrote:Enrico,

http://forums.fivetechsupport.com/viewt ... ound+error

magari hanno risolto (sicuramente) nelle versione successive di xharbour
Infatti funziona perfettamente. Ti conviene abbandonare la round2().

EMG
User avatar
pymsoft
Posts: 383
Joined: Tue Oct 11, 2005 1:01 pm
Location: Savona - Italia
Contact:

Re: Grosso problema utilizzando int()

Post by pymsoft »

ok, grazie.
Pedro Gonzalez
Post Reply