none
questione matematica RRS feed

  • Domanda

  • Salve a tutti!

    Ho una piccola questione matematica:

    P = Prezzo
    S = Sconto
    I = Importo scontato

    i tre numeri devono avere solo due cifre decimali.

    calcolo l'importo e lascio solo le ultime due cifre decimali 'troncando' le altre.

    I = P - P * S / 100

    adesso faccio l'operazione inversa e calcolo il prezzo partendo dall'importo (scorporo lo sconto)

    P = I * 100 / (100 - S)

    Ora, essendoci di mezzo un arrotondamento, e quindi perdita di precisione, non è detto che lo scorporo mi dia al centesimo il prezzo da cui sono partito.

    Non volendo mostrare all'utente due dati diversi a seconda dell'operazione che sta facendo, quando calcolo l'importo faccio due 'brutali' iterazioni in cui provo a scorporare lo sconto, se non ottengo il prezzo di partenza modifico l'importo di un centesimo (in più o in meno).

    Questa mia soluzione però è molto 'empirica' e per niente matematica. Qualcuno potrebbe fornirmi un ragionamento matematico che mi consenta di essere sicuro che avrò sempre lo stesso prezzo, anche quando farò lo scorporo dello sconto?

    Pileggi

    mercoledì 28 agosto 2013 13:55

Risposte

  • Non so se potrebbe andare bene spezzare la formula di ricostruzione di i  in due parti. Mi spiego.

    i=100; s=7;

    Calcolando e arrotondando p varrebbe 107,53

    volendo ottenere i da p dovresti calcolare lo sconto, cioè 107,53*7/100 arrotondarlo e poi sottrarlo da p

    per esempio

    s1=107,53*7/100 che arrotondato varrebbe 7,53

    i=107,53-s1=100

    che ne dici ?


    mario formosa

    Grazie mille Mario,

    ok, arrotondare invece di troncare... E arrotondare anche lo sconto... Farò qualche test!

    Però sto riflettendo che probabilmente ha ragione frenci2012: intuisco che un calcolo come i = p - p * s / 100 dove s è fisso e p deve avere solo due cifre decimali non può produrre tutti i numeri razionali, proprio perché p ha il limite delle due cifre decimali. Quindi se l'importo da trovare è uno di quei numeri che il calcolo non può produrre avrò inevitabilmente il problema. Non sono certo però che questa mia intuzione sia esatta...

    Purtroppo non ho molto tempo da dedicare ancora a questa questione, se non avete obiezioni segnerei questa come risposta temporanea, in quanto ancora non abbiamo una dimostrazione vera e propria e non abbiamo nemmeno trovato un caso in cui il calcolo di Mario (con arrotondamenti) oppure il mio (con troncamenti) fallisce.

    • Modificato pileggi giovedì 29 agosto 2013 09:50
    • Contrassegnato come risposta pileggi giovedì 29 agosto 2013 09:51
    giovedì 29 agosto 2013 08:33

Tutte le risposte

  • Potresti inserire i vari numeri da mostrare in una variabile. Dopo aver fatto ciò, quando li mostri tronchi le cifre decimali dalla terza in poi mentre quando devi operarci sopra recuperi il valore reale dalla variabile.
    mercoledì 28 agosto 2013 14:02
  • Ciao pileggi, secondo me è una questione di presentazione. All'utente mostri tramite format un valore arrotondato di ciò che in realtà ha però più cifre significative.

    per esempio :

     Dim pr As Single = 0
     Dim sc As Single = 0
     Dim ps As Single = 0
    
     pr = tb1.Text
     sc = tb2.Text
     ps = pr - pr * sc / 100
     tb3.Text = Format(ps, "###.##")


    mario formosa

    mercoledì 28 agosto 2013 14:18
  • Ciao pileggi, secondo me è una questione di presentazione. All'utente mostri tramite format un valore arrotondato di ciò che in realtà ha però più cifre significative.

    per esempio :

     Dim pr As Single = 0
     Dim sc As Single = 0
     Dim ps As Single = 0
    
     pr = tb1.Text
     sc = tb2.Text
     ps = pr - pr * sc / 100
     tb3.Text = Format(ps, "###.##")


    mario formosa

    Ciao Mario, grazie tante e anche a frenc2012. La vostra soluzione è molto semplice (e quindi bella) purtroppo però non è praticabile: c'è di mezzo un'applicazione esistente, un database, tanti dati già salvati con due sole cifre decimali... e le due operazioni possono essere fatte anche in momenti diversi (dopo aver nel frattempo arrestato l'applicazione).

    Vado in cerca di un calcolo 'dimostrato' che mi garantisca la reversibilità con sole due cifre decimali...

    mercoledì 28 agosto 2013 14:37
  • Ciao pileggi, aiutami a capire meglio. Facciamo un esempio :

    se p=17.56 ed s=10.21 allora i=15.767124

    se i viene salvato come 15.77 non credo possa esistere una formula che ti riporti p.

    Non so se ho capito.

    Non  potresti modificare i dati esistenti ricalcolando i nel db, e le procedure di presentazione, in modo da presentare per i solo due cifre decimale anche quando ne contenesse più di due ?


    mario formosa

    • Proposto come risposta System_ mercoledì 28 agosto 2013 15:35
    mercoledì 28 agosto 2013 15:26
  • La vostra soluzione è molto semplice (e quindi bella) purtroppo però non è praticabile: c'è di mezzo un'applicazione esistente, un database, tanti dati già salvati con due sole cifre decimali... e le due operazioni possono essere fatte anche in momenti diversi (dopo aver nel frattempo arrestato l'applicazione).

    Non capisco dove sia il problema... una volta che hai il numero da arrotondare, non ti costa niente salvare il numero reale in una variabile e, se sarà richiesto anche in un'altra nuova esecuzione dell'applicazione, magari in un file di testo.

    Se però, come hai detto, esistono già valori con due sole cifre decimali, allora concordo con Mario, non credo esista una formula in grado di attuare questa magia per aiutarti.


    • Modificato System_ mercoledì 28 agosto 2013 15:34 Miglioramento fraseologia
    mercoledì 28 agosto 2013 15:31
  • Ciao pileggi, aiutami a capire meglio. Facciamo un esempio :

    se p=17.56 ed s=10.21 allora i=15.767124

    se i viene salvato come 15.77 non credo possa esistere una formula che ti riporti p.

    Non so se ho capito.

    Non  potresti modificare i dati esistenti ricalcolando i nel db, e le procedure di presentazione, in modo da presentare per i solo due cifre decimale anche quando ne contenesse più di due ?


    mario formosa

    Ok Mario, ti illustro un caso reale:

    raramente l'applicazione mi fornisce un importo e io devo calcolare il prezzo che, una volta scontato, mi restituisca nuovamente l'importo esatto

    i = 100
    s = 7
    p = ?

    se io faccio lo scorporo e tronco dalla seconda cifra decimale ottengo

    p = 107,52

    quando ricalcolo l'importo partendo dal prezzo ottengo

    i = 99,99

    quello che ho pensato di fare io per risolvere è tenere fisso il calcolo dell'importo (nell'applicazione è di gran lunga il più usato) e quando devo riassegnare il prezzo faccio degli aggiustamenti, in questo modo:

    PrezzoNew = scorporaSconto(Importo, Sconto)
    For i As Integer = 1 To 2
      ImportoTemp = calcolaImporto(PrezzoNew, Sconto)
      Select Case ImportoTemp
        Case Is > Importo
          PrezzoNew -= 0.01
        Case Is < Importo
          PrezzoNew += 0.01
      End Select
    Next

    è molto triviale ma in tutti i casi che ho incontrato nei miei test ha trovato il valore desiderato, nel caso citato

    p = 107,53

    se dovesse venir fuori qualche numero che sgarra e che genera un importo con un centesimo di differenza non sarebbe un dramma, ma ovviamente non ne sarei felice. Esiste una soluzione matematica, senza dover cambiare i prezzi sul db (cosa molto onerosa e probabilmente per alcuni utenti sgradita)?

    Pileggi

    mercoledì 28 agosto 2013 16:49
  •  No.
    • Modificato System_ mercoledì 28 agosto 2013 17:07 Rimozione spazio iniziale
    mercoledì 28 agosto 2013 17:07
  • Non so se potrebbe andare bene spezzare la formula di ricostruzione di i  in due parti. Mi spiego.

    i=100; s=7;

    Calcolando e arrotondando p varrebbe 107,53

    volendo ottenere i da p dovresti calcolare lo sconto, cioè 107,53*7/100 arrotondarlo e poi sottrarlo da p

    per esempio

    s1=107,53*7/100 che arrotondato varrebbe 7,53

    i=107,53-s1=100

    che ne dici ?


    mario formosa

    mercoledì 28 agosto 2013 17:25
  • Non so se potrebbe andare bene spezzare la formula di ricostruzione di i  in due parti. Mi spiego.

    i=100; s=7;

    Calcolando e arrotondando p varrebbe 107,53

    volendo ottenere i da p dovresti calcolare lo sconto, cioè 107,53*7/100 arrotondarlo e poi sottrarlo da p

    per esempio

    s1=107,53*7/100 che arrotondato varrebbe 7,53

    i=107,53-s1=100

    che ne dici ?


    mario formosa

    Grazie mille Mario,

    ok, arrotondare invece di troncare... E arrotondare anche lo sconto... Farò qualche test!

    Però sto riflettendo che probabilmente ha ragione frenci2012: intuisco che un calcolo come i = p - p * s / 100 dove s è fisso e p deve avere solo due cifre decimali non può produrre tutti i numeri razionali, proprio perché p ha il limite delle due cifre decimali. Quindi se l'importo da trovare è uno di quei numeri che il calcolo non può produrre avrò inevitabilmente il problema. Non sono certo però che questa mia intuzione sia esatta...

    Purtroppo non ho molto tempo da dedicare ancora a questa questione, se non avete obiezioni segnerei questa come risposta temporanea, in quanto ancora non abbiamo una dimostrazione vera e propria e non abbiamo nemmeno trovato un caso in cui il calcolo di Mario (con arrotondamenti) oppure il mio (con troncamenti) fallisce.

    • Modificato pileggi giovedì 29 agosto 2013 09:50
    • Contrassegnato come risposta pileggi giovedì 29 agosto 2013 09:51
    giovedì 29 agosto 2013 08:33