Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [VB.Net] differenza sbagliata nel calcolo

    salve a tutti,

    vi espongo subito il mio problema.

    ho la seguente operazione:

    codice:
    Int((1 - ((TotApp / 10) -Int(TotApp / 10))) * 10)
    dove TotApp è dichiarato int32 e il suo valore è 114 però tale funzione non mi restitisce 6 com'è giusto che sia, ma 5....

    ho già trovato il problema, consiste in questa sottrazione:

    codice:
    (TotApp / 10) - Int(TotApp / 10)
    eseguendo tale sottrazione come espressione di controllo ho notato che il risultato non è 0,4( com'è ovvio, se la matematica non è un'opinione) ma 0,40000000000000036 facendomi sballare naturalmente il risultato di tutta l'espressione...

    volevo sapere come mai succede ciò, se sbaglio io qualcosa e eventualmente come posso risolvere???

    grazie
    Bombardare per la pace, è come trombare per la verginità.

    C'è qualcuno al mondo che tromba troppo secondo me...

    Andrea Medici

  2. #2
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    gentilissimo andreaciao_22, è vero che la matematica non è una opinione, ma solo se la si conosce. Tutti sanno che le operazioni in virgola mobile sono esatte solo con quei particolari numeri che possono essere espressi come potenze negative di due. Con tutti gli altri numeri, queste operazioni fatte con la matematica binaria, introducono errori di arrotondamento.

    Perciò, nel tuo codice, dichiara TotApp di tipo Decimal, in modo da evitare questi errori di arrotondamento, e vedrai che così, il risultato sarà 6
    Pietro

  3. #3
    gentilissimo pietro09,

    mi scuso per la mia ignoranza, visto che tutti sanno questa cosa tranne me e pochi altri eletti, ma ho prestato il cervallo a un amico che ne aveva tanto bisogno, spero me lo restituisca al più presto, così da non incappare in questi errori, basilari per la vita di chiunque...

    grazie ancora della dritta
    funziona alla grande
    Bombardare per la pace, è come trombare per la verginità.

    C'è qualcuno al mondo che tromba troppo secondo me...

    Andrea Medici

  4. #4
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Originariamente inviato da andreaciao_22
    gentilissimo pietro09,

    mi scuso per la mia ignoranza, visto che tutti sanno questa cosa tranne me e pochi altri eletti, ma ho prestato il cervallo a un amico che ne aveva tanto bisogno, spero me lo restituisca al più presto, così da non incappare in questi errori, basilari per la vita di chiunque...

    grazie ancora della dritta
    funziona alla grande
    Non prendertela, è che oggi sono un po' acido comunque non mi convince del tutto quella formula, in particolare l'uso di Int: spero che sia giustificato :master:



    ps. è che, tempo fa, qualunque libro comprassi di informatica, cominciava sempre dalle schede perforate per continuare con la rappresentazione interna dei numeri. Nel frattempo che leggevo, il programma per cui era stato comprato il libro, usciva fuori produzione o diventava obsoleto ma comunque, almeno quello me lo ricordo
    Pietro

  5. #5
    non me la sono presa... ho visto che facevi il saccente, volevo risponderti a tono...

    cmq ecco la funzione completa...
    questa mi calcola il checksum x un codice a barre EAN-13... basta passargli un codice numerico in formato stringa di 12 caratteri...
    codice:
        Function CarControllo(ByVal Codice As String) As String
            Dim Numero As Int16, NumAppesantito As Int32, TotApp As Decimal, i As Int32, y As Int16 = 1
            For i = 0 To Codice.Length - 1
                Numero = CType(Codice.Chars(i).ToString, Int16)
                NumAppesantito = Numero * 1
                If y Mod 2 = 0 Then NumAppesantito *= 3
                TotApp += NumAppesantito
                y += 1
            Next
            CarControllo = Int((1 - ((TotApp / 10) - Int(TotApp / 10))) * 10)
            If CarControllo = "10" Then CarControllo = "0"
            Return CarControllo
        End Function
    come di certo saprai il cecksum è quel numero che, sommato al valore(che io chiamo TotApp), restituisce un numero che diviso per 10 dia come resto 0...(che italiano del pippo)

    esempio:
    io ho questo numero 978888331012 e devo calcolare il checksum:

    secondo la teoria dell'ean-13 tutti i numeri in posizione pari vanno moltiplicati per 3 gli altri *1... sommando poi tutte le moltiplicazioni fatte. il primo carattere è in posizione 1.

    dopo i dovuti calcoli avremo un totale di 114

    114+6=120

    6 è il carattere di controllo

    quindi il codice a barre è: 978888310126
    Bombardare per la pace, è come trombare per la verginità.

    C'è qualcuno al mondo che tromba troppo secondo me...

    Andrea Medici

  6. #6
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    un amico del forum javascript mi ha suggerito questo:

    Dim t As Integer = 114
    Dim b As Integer = 10
    Dim CarControllo As Integer = 0

    CarControllo = (b * Math.Ceiling(t / b)) - t

    PrintLn(CarControllo) '--> restituisce 6
    Pietro

  7. #7
    grazie... poi provo.... x curiosità che fa il ceiling?
    Bombardare per la pace, è come trombare per la verginità.

    C'è qualcuno al mondo che tromba troppo secondo me...

    Andrea Medici

  8. #8
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Math.Ceiling(1.9) --> 2
    Math.Floor(1.9) --> 1
    Pietro

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.