Grosso problema utilizzando int()

Moderator: Enrico Maria Giordano

Grosso problema utilizzando int()

Postby Marco Turco » Thu Jul 16, 2009 8:00 am

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

Re: Grosso problema utilizzando int()

Postby pymsoft » Thu Jul 16, 2009 8:12 am

Marco,


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


o

nTotale := INT( Round( nTotale, 2 ) )
Pedro Gonzalez
User avatar
pymsoft
 
Posts: 383
Joined: Tue Oct 11, 2005 1:01 pm
Location: Savona - Italia

Re: Grosso problema utilizzando int()

Postby Marco Turco » Thu Jul 16, 2009 9:38 am

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

Re: Grosso problema utilizzando int()

Postby pymsoft » Thu Jul 16, 2009 9:52 am

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

Re: Grosso problema utilizzando int()

Postby Enrico Maria Giordano » Thu Jul 16, 2009 2:39 pm

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

EMG
User avatar
Enrico Maria Giordano
 
Posts: 8310
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

Re: Grosso problema utilizzando int()

Postby Marco Turco » Thu Jul 16, 2009 5:27 pm

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

Re: Grosso problema utilizzando int()

Postby Enrico Maria Giordano » Thu Jul 16, 2009 5:58 pm

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
Enrico Maria Giordano
 
Posts: 8310
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

Re: Grosso problema utilizzando int()

Postby pymsoft » Fri Jul 17, 2009 7:38 am

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

Re: Grosso problema utilizzando int()

Postby Marco Turco » Fri Jul 17, 2009 9:19 am

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

Marco Turco
SOFTWARE XP LLP
User avatar
Marco Turco
 
Posts: 858
Joined: Fri Oct 07, 2005 12:00 pm
Location: London

Re: Grosso problema utilizzando int()

Postby Enrico Maria Giordano » Fri Jul 17, 2009 9:42 am

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
Enrico Maria Giordano
 
Posts: 8310
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

Re: Grosso problema utilizzando int()

Postby pymsoft » Fri Jul 17, 2009 2:07 pm

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

Re: Grosso problema utilizzando int()

Postby Enrico Maria Giordano » Fri Jul 17, 2009 6:17 pm

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

Re: Grosso problema utilizzando int()

Postby pymsoft » Wed Jul 22, 2009 12:18 pm

ok, grazie.
Pedro Gonzalez
User avatar
pymsoft
 
Posts: 383
Joined: Tue Oct 11, 2005 1:01 pm
Location: Savona - Italia


Return to All products support

Who is online

Users browsing this forum: No registered users and 6 guests