Autore Topic: Stringhe e numeri  (Letto 2859 volte)

Offline Gaspare

  • Gambero
  • **
  • Post: 68
    • Mostra profilo
Re: Stringhe e numeri
« Risposta #15 il: 15 Settembre 2009, 17:00:35 »
qualcuno ha giustamente chiesto prima: Ma vuoi fare operazioni aritmetiche con delle stringhe?

entrambi le variabili tempo e durata sono state dichiarate stringhe e quindi gambas le tratta come tali anche se vi assegniamo dei numeri (li converte automaticamente).
per usare queste variabili in operazioni matematiche vanno riconvertite e diventano (se non contengono altri caratteri oltre alle cifre):
cint(tempo) e cint(durata)

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Stringhe e numeri
« Risposta #16 il: 16 Settembre 2009, 11:30:42 »
Esatto!

Comunque, il troncamento di un numero può essere fatto in diversi modi:
- usare le funzioni CInt(float number)
- convertirlo in stringa come scritto da cesko, e riconvertire la stringa con Val()

L'arrotondamento si può eseguire con Round(a,b). Il primo parametro è il valore float, il secondo indica il numero di digit che intendi ritornare insieme al valore convertito; se indichi 0 il valore ritornato sarà arrotondato all'ultima cifra intera. Valori negativi ritornano un numero con decimali; valori positivi arrotonderanno alla cifra intera (es. Round(1972, 2)=2000.

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Stringhe e numeri
« Risposta #17 il: 07 Febbraio 2012, 22:51:30 »
Ho trovato questa discussione durante la ricerca di un algoritmo di troncamento di un valore float alle prime due cifre decimali, strettamente legato al trattamento di dati numerici di tipo valuta.
Non avendo trovato alcunchè sul troncamento di valori float legato alle cifre decimali, mantenendo inalterata, ovviamente, la parte intera, ho scritto le seguenti istruzioni in grado di effettuare il troncamento occorrente alle mie necessità:
Codice: [Seleziona]
$Valuta = fValuta
  i = InStr($Valuta ".")
  IF i <> 0 THEN
    $Int = Left($Valuta, i - 1)
    $Dec = Mid($Valuta, i + 1, 2)
  ENDIF
  $Valuta = $Int & "." & $Dec
Semprecchè non esista già una funzione specifica, io non ho saputo fare di meglio. Secondo voi, può andare così o posso migliararlo ulteriormente?
Grazie per l'attenzione.  :D
 :ciao:  :ciao:
« Ultima modifica: 07 Febbraio 2012, 22:54:40 da Picavbg »
:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Stringhe e numeri
« Risposta #18 il: 07 Febbraio 2012, 23:06:43 »
Secondo voi, può andare così o posso migliararlo ulteriormente?
:ciao:
Non so se fa proprio al caso tuo:

Codice: [Seleziona]
Public Sub Button1_Click()

  Dim a As Float = 5.123456789

     a = Fix(a * 100) / 100

  Print a

End

...alla fine ottengo in console: 5,12   :-[
« Ultima modifica: 07 Febbraio 2012, 23:20:22 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Stringhe e numeri
« Risposta #19 il: 07 Febbraio 2012, 23:55:33 »
Ti ringrazio per l'ottimo suggerimento.
Ho svolto la seguente prova nel mio programma, coi nomi campo effettivi:
Codice: [Seleziona]
  PRINT "f_TotResta vecchio= '" & f_TotResta & "'"
  PRINT "f_SaldoFin vecchio= '" & f_SaldoFin & "'"
  f_TotResta = Fix(f_TotResta * 100) / 100
  f_SaldoFin = Fix(f_SaldoFin * 100) / 100
  PRINT "f_TotResta nuovo= '" & f_TotResta & "'"
  PRINT "f_SaldoFin nuovo= '" & f_SaldoFin & "'"
risultato:
f_TotResta vecchio= '385.87'
f_SaldoFin vecchio= '385.870000000003'
f_TotResta nuovo= '385.86'
f_SaldoFin nuovo= '385.87'

Come puoi vedere, ha funzionato solo per il 2° campo, mentre il primo è stato alterato nella sua parte decimale, invalidando i passi successivi del programma.
 :ciao:
:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Stringhe e numeri
« Risposta #20 il: 08 Febbraio 2012, 03:18:19 »
Come puoi vedere, ha funzionato solo per il 2° campo, mentre il primo è stato alterato nella sua parte decimale, invalidando i passi successivi del programma.
 :ciao:

 :ciao:
...è alquanto strano !

Da quello che mi sembra di capire, f_TotResta iniziale è uguale a: 385.87 , mentre f_SaldoFin iniziale è uguale a: 385.870000000003
Ritenendo che quei valori iniziali fossero giusti, ho fatto questa prova:
Codice: [Seleziona]
Public Sub Button1_Click()

 Dim f_TotResta As Float = 385.87
 Dim f_SaldoFin As Float = 385.870000000003

  Print "f_TotResta vecchio= '" & f_TotResta & "'"
  Print "f_SaldoFin vecchio= '" & f_SaldoFin & "'"
  f_TotResta = Fix(f_TotResta * 100) / 100
  f_SaldoFin = Fix(f_SaldoFin * 100) / 100
  Print "f_TotResta nuovo= '" & f_TotResta & "'"
  Print "f_SaldoFin nuovo= '" & f_SaldoFin & "'"

End

Il risultato in console è stato il seguente:

f_TotResta vecchio= '385.87'
f_SaldoFin vecchio= '385.870000000003'
f_TotResta nuovo= '385.87'      <------
f_SaldoFin nuovo= '385.87'

                                                           :-\
« Ultima modifica: 08 Febbraio 2012, 03:34:32 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Stringhe e numeri
« Risposta #21 il: 08 Febbraio 2012, 10:24:49 »
La dichiarazione dei tue campi numerici in questione è fatta all'inizio del form:
Codice: [Seleziona]
PRIVATE f_SaldoFin AS Float
PRIVATE f_TotResta AS Float = 0
f_TotResta  è valorizzato a '0'  nella stessa riga di dichiarazione perchè il suo contenuto viene sempre incrementato, mentre  f_SaldoFin  non ha bisogno di una valorizzazione iniziale perchè, la prima volta che riceve dati , li riceve tramite trasferimento. Entrambi i campi possono ricevere valori decimali o interi a seconda che la moneta in circolazione sotto la data corrente sia €uro o £ira. A parte tutto ciò, io sono convinto che il valore raggiunto in un dato momento da  f_TotResta sia non proprio (tanto per rimanere nell'esempio)  385.87, ma un valore inferiore, assai vicino ad esso. Solo così posso spiegarmi il nuovo valore dopo il troncamento con   f_TotResta = Fix(f_TotResta * 100) / 100.
Il troncamento si rende necessario per potere ottenere, in casi come quello che si è manifestato ieri, un'uguaglianza dalla if successiva che altrimenti non si verifecherebbe. Non dimentichiamo poi che la nostra attuale moneta arriva fino ai centesimi.
Purtroppo, sempre nello stesso programma, ho dovuto affrontare già in altre occasioni situazioni di valori numerici float che nominalmente avrebbero dovuto esporre valori uguali, ma che in pratica non è avvenuto, proprio come è successo ieri. Ciò mi ha fatto pensare al troncamento fino alle due cifre decimali. Però, alla luce della prova fatta ieri notte, dopo la tua brillante idea (io non ci avevo proprio pensato), resto sempre dell'opinione che la strada più sicura da percorrere sia il passaggio dei valori in campi di comodo, in formato stringa, come nella formula algoritmica con cui ho riaperto la discussione.
Grazie comunque, ti sono veramente grato.  :D
 :ciao:
:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Stringhe e numeri
« Risposta #22 il: 08 Febbraio 2012, 10:31:10 »
io sono convinto che il valore raggiunto in un dato momento da  f_TotResta sia non proprio (tanto per rimanere nell'esempio)  385.87, ma un valore inferiore, assai vicino ad esso. Solo così posso spiegarmi il nuovo valore dopo il troncamento con   f_TotResta = Fix(f_TotResta * 100) / 100.

 :ciao:
...è lo stesso sospetto che avevo io. Quello strano risultato non poteva essere determinato da Fix, in quanto - come sai - esso restituisce la parte intera sic et simpliciter di un numero... un po' come Int .
« Ultima modifica: 08 Febbraio 2012, 10:37:34 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Stringhe e numeri
« Risposta #23 il: 08 Febbraio 2012, 12:37:23 »
io per arrotondare i decimali ho sempre utilizzato round

dim f as float = 12.6800000003

f=round(f,-2)

print f

sto scrivendo dal telefono,per cui non posso provare il codice, ma se la memoria non mi inganna dovrebbe essere funzionante, il -2 indica ilnumero di cifre decimali

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Stringhe e numeri
« Risposta #24 il: 08 Febbraio 2012, 12:44:24 »
io per arrotondare i decimali ho sempre utilizzato round
dim f as float = 12.6800000003
f=round(f,-2)
print f
sto scrivendo dal telefono,per cui non posso provare il codice, ma se la memoria non mi inganna dovrebbe essere funzionante, il -2 indica ilnumero di cifre decimali

Soccorso "Sgombra neve" !   :P
...)-oHOHo provato io il tuo codice, fsurfing  :ciao: , e funziona perfettamente !
Molto bene: un'istruzione anche più breve di quella che avevo suggerito io.
« Ultima modifica: 08 Febbraio 2012, 13:19:07 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Stringhe e numeri
« Risposta #25 il: 08 Febbraio 2012, 13:00:31 »
Qui non abbiamo bisogno dello spazzaneve, ma solo di scafandri da palombaro per immergerci nella pioggia quasi continua. Poi considerando che ci sono località con -21°, noi, con appena 3°, potremmo scendere al mare, per fare il bagno.  :D

Ho provato  anch'io il codice suggerito da fsurfing ed, effettivamente, sembra che funzioni. Ecco il risultato:
Citazione
Codice: [Seleziona]
PRIVATE f_SaldoFin AS Float
PRIVATE f_TotResta AS Float = 0
------- bla bla -------
------- bla bla -------
 PRINT "f_TotResta vecchio= '" & f_TotResta & "'"
  PRINT "f_SaldoFin vecchio= '" & f_SaldoFin & "'"
  f_TotResta = Round(f_TotResta, -2)
  f_SaldoFin = Round(f_SaldoFin, -2)
  PRINT "f_TotResta nuovo= '" & f_TotResta & "'"
  PRINT "f_SaldoFin nuovo= '" & f_SaldoFin & "'"
'------------------------------------------------------
f_TotResta vecchio= '385.87'
f_SaldoFin vecchio= '385.870000000003'
f_TotResta nuovo= '385.87'
f_SaldoFin nuovo= '385.87'

Grazie a tutti e due.  :2birre:
:ciao: