3.708 messaggi dal 28 gennaio 2003
Il codice seguente, data una coordinata in gradi sessadecimali, la trasforma in geografica (gradi primi secondi). Ho un problema con l'imprecisione del double.
Dim coordinata As Double = 40.05

Dim gradi, primi As Integer
Dim secondi As Double
Dim r As Double

gradi = CInt(Math.Floor(coordinata))
r = (coordinata - gradi) * 60
primi = CInt(Math.Floor(r))
secondi = (r - primi) * 60

Dim s As String = gradi & "° " & primi & "' " & secondi.ToString("#,##0.000") & """"

'restituisce 40° 2' 60.000" che è sbagliato


Mi restituisce restituisce 40° 2' 60.000" ma è sbagliato (i secondi debbono essere < 60)

se invece di usare il Double uso il decimal, ottengo il risultato esatto: 40° 3' 0.000"

usando il double ma mofificando il codice in
Dim s As String = gradi & "° " & primi & "' " & (Math.Floor(secondi * 100000) / 100000).ToString("#,##0.00000") & """"


ottengo un risultato con una buona approssimazione e non sbagliato

La domanda è: come si risolvono in genere questi problemi usando il Double? conviene usare il decimal?

Pietro
25 messaggi dal 04 luglio 2003
Ho avuto anche io problemi di arrotondamento e dopo molti esperimenti con funzioni di arrotondamenti, troncamenti ecc. ti posso confermare che, per quanto ne so, la soluzione definitiva e' quella che hai scritto, cioe' per i numerici con decimali usare sempre Decimal al posto di Double (o Single o altro a virgola mobile), e questo anche nella definizione dei campi dei database.
3.708 messaggi dal 28 gennaio 2003
Accetto il tuo consiglio. Ciao.

Pietro

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.