Strani arrotondamenti

di il
6 risposte

Strani arrotondamenti

Ciao a tutti, vi posto un pezzo di codice che ho scritto. Serve per un calcolo di variazioni handicap nel golf, ma il principio è molto semplice: si inserisce in una textbox l'handicap di partenza, in un'altra textbox il punteggio ottenuto e poi si calcola l'handicap aggiornato.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim hcp_part As Single, score As Integer
        hcp_part = Convert.ToSingle(TextBox1.Text)
        score = Convert.ToInt16(TextBox2.Text)
        If score < 32 Then
            hcp_part = hcp_part + 0.1
        ElseIf score > 36 Then
            For i As Integer = 37 To score
                If hcp_part <= 6 Then
                    hcp_part = hcp_part - 0.2
                ElseIf hcp_part > 6 And hcp_part < 13 Then
                    hcp_part = hcp_part - 0.3
                ElseIf hcp_part >= 13 Then
                    hcp_part = hcp_part - 0.5
                End If
            Next
        End If
        Hcp_finale.Text = hcp_part
    End Sub
Ho notato però che esistono casi critici: ad esempio inserendo 4,5 nell'handicap di partenza e 54 nel punteggio si ottiene 0,8999997 anzichè 0,9.
Come mai? Dove sbaglio? Forse in qualche conversione di tipo?
Se avete qualche correzione da fare, ditemi tutto: sono alle prime armi e i consigli non bastano mai!
Saluti

6 Risposte

  • Re: Strani arrotondamenti

    Ciao minomic
    Un primo consiglio è quello di usare sempre i Double al posto dei Single, hai una maggior precisione (e comunque i single vengono converiti in double, i microprocessori dei pc lavorano con i double).

    Poi potresti dare un' occhiata a questo link in cui spiega che i valori in virgola mobile sono approsimazzioni e possono portare a risultati scorretti.

    La soluzione al tuo problema è quello di arrotondare i valori alla precisione voluta con la funzione:
    
    Math.Round(Double, Int32)
    
    Che arrotonda un numero alla precisione indicata, ad es Math.Round(d, 10) arrotonda alla decima cifra decimale. Nel tuo caso 0.89999999999999813 verrebbe arrotondato come 0.9000000000 e mostrato come 0.9.
  • Re: Strani arrotondamenti

    Per prima cosa grazie della risposta, però purtroppo non funziona ancora: ho cambiato il codice così:
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim hcp_part As Double, score As Integer
            hcp_part = Convert.ToDouble(TextBox1.Text)
            score = Convert.ToInt16(TextBox2.Text)
            If score < 32 Then
                hcp_part = hcp_part + 0.1
            ElseIf score > 36 Then
                For i As Byte = 37 To score
                    If hcp_part <= 6 Then
                        hcp_part = hcp_part - 0.2
                    ElseIf hcp_part > 6 And hcp_part < 13 Then
                        hcp_part = hcp_part - 0.3
                    ElseIf hcp_part >= 13 Then
                        hcp_part = hcp_part - 0.5
                    End If
                Next
            End If
            Math.Round(hcp_part, 10)
            hcp_finale.Text = hcp_part
        End Sub
    ma il risultato è questo:

    Uploaded with ImageShack.us
  • Re: Strani arrotondamenti

    Ciao minonic, devi scrivere:
    
    hcp_part = Math.Round(hcp_part, 10)
    
  • Re: Strani arrotondamenti

    Sì hai ragione, sono io che sono un pirla
    è che sto facendo diverse cose in una volta...ma nessuna viene bene!
    comunque grazie, problema risolto!
  • Re: Strani arrotondamenti

    Ho visto che inviti l' utente a usare la virgola per introdurre i numeri decimali. Potresti evitarlo facendo un
    
    hcp_part = Convert.ToDouble(TextBox1.Text.Replace(".", ","))
    
    In questo modo il programma accetta sia numeri con il punto che con la virgola.

    Ci sarebbe poi il discorso che su alcuni pc il separatore non è la virgola ma un altro carattere (dipende dalla localizzazione) per cui leggendo i numeri con la virgola il tuo programma sbaglierebbe. Ma è un problema che puoi rimandare fino a quendo non inizierai a distribuire il programma all' estero.
  • Re: Strani arrotondamenti

    Certo: oggi l'italia, domani il mondo!!!
    comunque grazie per il suggerimento!
Devi accedere o registrarti per scrivere nel forum
6 risposte