Gambas-it

Gambas3 => Domande tecniche => Topic aperto da: Gianluigi - 10 Febbraio 2014, 00:20:47

Titolo: E' normale che Round non arrotondi?
Inserito da: Gianluigi - 10 Febbraio 2014, 00:20:47
Ho notato una cosa che forse è normale ma ne vorrei se possibile conferma da voi:

Se inserisco nella funzione aritmetica Round un'espressione tipo: Round(Paint.Font.Size * 1.3441,-2) invece di ottenere un numero con due decimali ottengo il numero originale e cioè non arrotondato. In effetti nella guida si parla di numero arrotondato, però nella mia ingenuità credevo funzionasse anche così. :-\

Grazie dell'attenzione
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: vuott - 10 Febbraio 2014, 01:06:31
Come premessa rinvio ad una essenziale, ma efficace ed esaustiva, spiegazione scritta da md9327 sulla funzione Round():
http://www.gambas-it.org/smf/index.php?topic=1865.msg20789#msg20789


Se io scrivo un semplice codice (di cui riporto appresso la parte che ci interessa) rifacendomi al tuo caso:
Codice: gambas [Seleziona]

.......

    Paint.Font.Size = 12
 
 
    Print Paint.Font.Size * 1.3441
   
' Viene chiesto alla funzione "Round()" di arrotondare il secondo numero decimale:
    Print Round(Paint.Font.Size * 1.3441, -2)

End

in console ottengo questi risultati:

16,1292  senza funzione Round();
16,13  con la funzione Round().

Quindi funziona.  :-\
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: Gianluigi - 10 Febbraio 2014, 10:09:17
Come premessa rinvio ad una essenziale, ma efficace ed esaustiva, spiegazione scritta da md9327 sulla funzione Round():
http://www.gambas-it.org/smf/index.php?topic=1865.msg20789#msg20789
Se io scrivo un semplice codice (di cui riporto appresso la parte che ci interessa) rifacendomi al tuo caso:
Codice: gambas [Seleziona]
......
    Paint.Font.Size = 12
    Print Paint.Font.Size * 1.3441   
' Viene chiesto alla funzione "Round()" di arrotondare il secondo numero decimale:
    Print Round(Paint.Font.Size * 1.3441, -2)
End

in console ottengo questi risultati:

16,1292  senza funzione Round();
16,13  con la funzione Round().
Quindi funziona.  :-\
:-\
Beato te a me no ora vado a scrivere un piccolo esempio e lo posto
ciao
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: vuott - 10 Febbraio 2014, 11:01:36
Quando devi allegare un file, dopo aver cliccato su "Rispondi", devi cliccare in basso a sinistra su "Opzioni aggiuntive...", quindi sul tasto virtuale "Browse...".

Ad ogni modo, puoi anche solo inserire nella tua risposta il codice (...possibilmente solo la parte essenziale !), usando il tasto in alto a destra "Evidenzia la sintassi".
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: Gianluigi - 10 Febbraio 2014, 11:05:23
 :-[

(secondo tentativo)
scusa vuott ma non capisco come funzionano gli inserimenti delle foto e dei file non so se è colpa loro ma se tento di citarti (era già successo prima ma non me ne ero accorto)  nel mio sommario della discussione la citazione del tuo post mi appare ripetuta parecchie volte.

Spero ci siano gli allegati che sono: l'ultimo esempio che avevo postato nella discussione Differenze fra testo disegnato e testo scritto con l'aggiuta di MessageBox e Print, più la foto dei risultati nella mia console.
Io sto usando:
3.5.99.1+svn20140209+build18~ubuntu13.10.1
ciao e grazie
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: vuott - 10 Febbraio 2014, 12:28:31
Ho dato un'occhiata al codice che hai allegato, i cui risultati in console sono coerenti con quelli visibili nell'immagine che hai allegato.

Il tuo codice mostra 5 risultati in rispettivi MessageBox. Al riguardo faccio notare che all'interno della Sub DisegnoX:
* il valore mostrato nel primo Message non è soggetto alla funzione Round(), in quanto non previsto;
* il valore mostrato nel secondo Message non è soggetto alla funzione Round(), in quanto non previsto;
* il valore mostrato nel terzo Message non è soggetto alla funzione Round(), perché non v'è passaggio nella riga precedente con l'istruzione IF ;
* il valore mostrato nel quarto Message non è soggetto alla funzione Round(), perché non v'è passaggio nella riga precedente con l'istruzione IF .


Titolo: Re: E' normale che Round non arrotondi?
Inserito da: Gianluigi - 10 Febbraio 2014, 16:55:06
Ho dato un'occhiata al codice che hai allegato, i cui risultati in console sono coerenti con quelli visibili nell'immagine che hai allegato.

Il tuo codice mostra 5 risultati in rispettivi MessageBox. Al riguardo faccio notare che all'interno della Sub DisegnoX:
* il valore mostrato nel primo Message non è soggetto alla funzione Round(), in quanto non previsto;
* il valore mostrato nel secondo Message non è soggetto alla funzione Round(), in quanto non previsto;
* il valore mostrato nel terzo Message non è soggetto alla funzione Round(), perché non v'è passaggio nella riga precedente con l'istruzione IF ;
* il valore mostrato nel quarto Message non è soggetto alla funzione Round(), perché non v'è passaggio nella riga precedente con l'istruzione IF .

 :-[
Hai ragione il tutto era un po confuso e per giunta dopo il ciclo di rimpicciolimento la scritta non l'avevo passata al Round però se poi davi la stampa vedevi tutti gli arrotondamenti. Se fossi però passato prima dalla stampa ottenevi un bug (mi ero dimenticato di passare la 'misura video' anche qui, e le prove le facevo disegnando sempre prima... cosa vuoi che ti dica, però ti assicuro che se mi danno del furbo mi offendo).
Come è difficile essere precisi...

Una cosa non capisco se io faccio  Paint.Font.Size = Round(Paint.Font.Size * 1.3441, -2) poi non devo controllare il valore restituito da  Paint.Font.Size per sapere se la funzione “Funziona”  :-\
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: vuott - 10 Febbraio 2014, 17:10:43
Una cosa non capisco se io faccio  Paint.Font.Size = Round(Paint.Font.Size * 1.3441, -2) poi non devo controllare il valore restituito da  Paint.Font.Size per sapere se la funzione “Funziona”

Non capisco se è una domanda o un'affermazione.
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: Gianluigi - 10 Febbraio 2014, 17:18:03
Una cosa non capisco se io faccio  Paint.Font.Size = Round(Paint.Font.Size * 1.3441, -2) poi non devo controllare il valore restituito da  Paint.Font.Size per sapere se la funzione “Funziona”

Non capisco se è una domanda o un'affermazione.

E' una domanda con 3 punti interrogativi ed esclamativi, però l'ho detto che è difficile essere precisi... :)
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: vuott - 10 Febbraio 2014, 17:53:21
ma... non capisco cosa potrei dirti.... se intendi verificare, poni delle istruzioni per la verifica. Cosa posso dirti ?  :-\
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: Gianluigi - 10 Febbraio 2014, 18:08:58
ma... non capisco cosa potrei dirti.... se intendi verificare, poni delle istruzioni per la verifica. Cosa posso dirti ?  :-\

Se è lecito il codice Paint.Font.Size = Round(Paint.Font.Size * 1.3441, -2) allora in base al mio esempio quello denominato ProvaGian_2 Gambas non funziona.  :-\

Non saprei come meglio spiegarmi  :'(
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: fsurfing - 10 Febbraio 2014, 19:10:39
quello che credo vuott ti stesse dicendo è che se nel tuo codice scrivi:
Codice: [Seleziona]
 If sDevice = "Stampante" Then Paint.Font.Size = Round(Paint.Font.Size * F_GAMBERETTO_STAMPA, -2)
    Print Paint.Font.Size   
    Message(Paint.Font.Size)
il round entra in funzione solo quando l' espressione nell' IF è vera , ovvero quando il device è stampante altrimenti il round non viene eseguito e quindi non viene eseguito l' arrotondamento
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: Gianluigi - 10 Febbraio 2014, 19:45:48
quello che credo vuott ti stesse dicendo è che se nel tuo codice scrivi:
Codice: [Seleziona]
 If sDevice = "Stampante" Then Paint.Font.Size = Round(Paint.Font.Size * F_GAMBERETTO_STAMPA, -2)
    Print Paint.Font.Size   
    Message(Paint.Font.Size)
il round entra in funzione solo quando l' espressione nell' IF è vera , ovvero quando il device è stampante altrimenti il round non viene eseguito e quindi non viene eseguito l' arrotondamento
:-\
Si avete ragione ma dopo, successivamente, ho postato del codice meno confuso (ProvaGian_2) che ingloba nell'If anche Message e Print. E comunque anche prima (ProvaGian) usando le tue precauzioni, cioè stampando su file, appena uno usava stampa otteneva i valori da me postati.
L'unica cosa che posso aggiungere per spiegarmi meglio è che chiamare passo 3 stampa e passo 4 stampa, non spiega nulla il passo 3 stampa è l'adeguamento per la stampante del font.size ridimensionato per rientrare nel rettangolo e il passo 4 stampante è praticamente il ritorno al size originale.
Forse occorreva un esempio più semplificato ma siccome era codice di cui avevamo discusso in precedenza, ed era quello che mi ha, per così dire, ispirato la domanda...

Il punto comunque rimane questo è o non è lecito passare alla funzione ROUND un'espressione? E se è lecito, è lecito interrogare il codice come faccio io:
Paint.Font.Size = Round(Paint.Font.Size * 1.3441, -2)
Print Paint.Font.Size

perché se questo è giusto allora il mio Gambas non funziona o meglio non arrotonda.  ???
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: fsurfing - 10 Febbraio 2014, 19:51:59
è lecito e a me funzionante
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: vuott - 10 Febbraio 2014, 20:00:40
quello che credo vuott ti stesse dicendo è che....
...il round entra in funzione solo quando....

fsurfing: santo e benedetto !  (http://levipere.com/wp-content/plugins/smilies-themer/Axendr/party0040.gif)
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: Gianluigi - 10 Febbraio 2014, 20:16:21
quello che credo vuott ti stesse dicendo è che....
...il round entra in funzione solo quando....

fsurfing: santo e benedetto !  (http://levipere.com/wp-content/plugins/smilies-themer/Axendr/party0040.gif)

Quindi mi state dicendo che avete provato ProvaGian2 e a voi non da questi risultati  ???


Cosa faccio un consiglio  :rolleyes:

PS. ma come fa vuott ad avere tutti quegli stupendi effetti speciali
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: Gianluigi - 10 Febbraio 2014, 20:24:28
Scusate ma abbandono il campo ho internet che non mi funziona Ciao
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: vuott - 10 Febbraio 2014, 20:30:27
PS. ma come fa vuott ad avere tutti quegli stupendi effetti speciali

...perché vuott è un fervente seguace di San Midi, musico ed eremita.
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: fsurfing - 10 Febbraio 2014, 20:34:16
io non avevo provato prova2, ma provavo se funzionava round , cmq round funziona perfettamente , è solo che paint.font.size (giustamente x me) se ne infischia del round e utilizza il valore completo del numero float
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: vuott - 10 Febbraio 2014, 20:37:49
...non solo, ma io vedo questa strana riga con Round():
Codice: gambas [Seleziona]
'' Qui è vero non l'avevo arrotondato ora ho provveduto scusa scusa
    Round(Paint.Font.Size - 0.1)

Non funziona così questa funzione !   :violent:


Ad ogni modo, a me escono questi risultati in console:
I° Video 19.34
Passo 2 19.33984375
I° Stampa 19.34
Passo 2 19.33984375
Passo 3 stampa 18.5595703125
Passo 4 stampa 25.9892578125
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: fsurfing - 10 Febbraio 2014, 20:38:33
vabbè quella non l' avevo nealche calcolata, non è quello il problema, probabile sia una svista
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: vuott - 10 Febbraio 2014, 20:42:35
.... probabile sia una svista

Sicuramente è una svista, ma... non capisco quale variabile avrebbe riempito... e per quale altra istruzione !  :-\
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: fsurfing - 10 Febbraio 2014, 20:43:51
l' intenzione era questa:

Codice: [Seleziona]
Paint.Font.Size = Round(Paint.Font.Size, - 2)
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: fsurfing - 10 Febbraio 2014, 20:46:21
comunque è giusto così round effettu al' arrotondamento, ma se il valore viene ridato ad una variabile float , questa perde l' arrotondamento.

SE volete sare il motivo alla base di ciò si deve chiedere a mdxxxx che sicuramente risolve l' arcano
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: vuott - 10 Febbraio 2014, 20:49:00
SE volete sare il motivo alla base di ciò si deve chiedere a mdxxxx

....eh, sembra che di lui ultimamente non siano rimaste neppure le x !   :'(
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: Gianluigi - 10 Febbraio 2014, 21:11:26
l' intenzione era questa:

Codice: [Seleziona]
Paint.Font.Size = Round(Paint.Font.Size, - 2)

Si la mia intenzione era quella   :rolleyes:

comunque è giusto così round effettu al' arrotondamento, ma se il valore viene ridato ad una variabile float , questa perde l' arrotondamento.

SE volete sare il motivo alla base di ciò si deve chiedere a mdxxxx che sicuramente risolve l' arcano

Ma a questo punto basta evitare gli arrotondamenti oppure passare tutti i risultati attraverso variabili e poi passare quelle a Paint  ???



mdxxxx che sicuramente risolve l' arcano

In effetti la cosa sembra strana.
Ho effetuato la prova che segue:
Codice: gambas [Seleziona]
Paint.Font.Size = Round(Paint.Font.Size * F_GAMBERETTO_STAMPA, -2)
Print "Passo 4 stampa ", Paint.Font.Size, Paint.Font.Size * F_GAMBERETTO_STAMPA, Round(Paint.Font.Size * F_GAMBERETTO_STAMPA, -2)


ed ecco i risultati in console:

Passo 4 stampa      25.9892578125   34,9321614257813   34,93

Ma allora vi ho scatenati  :)
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: Gianluigi - 10 Febbraio 2014, 21:14:50
Cosa è successo ho citato qualcosa che non vedo più cosa devo fare ???
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: fsurfing - 10 Febbraio 2014, 21:23:08
per me ha più senso che sia così, quando si lavora con variabili float è meglio avere tutti i decimali (soprattutto nel caso di gianluigi che vuole disegnare con una certa precisione)poi se

il risultato finale si vuole  mostrarlo con arrotondamento si utilizza round, io per lo meno uso round solo quando devo mostrare un risultato senza avere decimali lunghissimi.
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: fsurfing - 10 Febbraio 2014, 21:33:26
una cosa non capisco... e del resto è un pò  :ot:  ma perchè dai un sacco di

Codice: [Seleziona]
 Paint.Save
    Paint.Clip
     Paint.Restore  

e inoltre metti a true il preserve di
paint.fill e paint.stroke ?


che poi non sfrutti ? o mi sono perso qualcosa io?
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: Gianluigi - 10 Febbraio 2014, 22:08:46
una cosa non capisco... e del resto è un pò  :ot:  ma perchè dai un sacco di

Codice: [Seleziona]
 Paint.Save
    Paint.Clip
     Paint.Restore  

e inoltre metti a true il preserve di
paint.fill e paint.stroke ?


che poi non sfrutti ? o mi sono perso qualcosa io?

 :-[
Allora credo che sia successo questo, potrei togliere il credo ma lo lascio ugualmente, faccio un sacco di prove mettendo e togliendo tutto quello che riguarda Paint ecc. e poi guardo cosa succede.
Questo codice usato per  la dimostrazione fa parte di una routine più lunga e queste sono per così dire scorie da imbranato studioso impreciso.
Questo non significa che ho capito Paint, ma solo che lo sto studiando in base alle mie scarse possibilità, ti ringrazio dell'interessamento e qualunque consiglio tu abbia voglia di darmi è più che gradito, poi riguardando il codice che ho avuto il coraggio di postare ora un po me ne vergogno.
Seguirò il tuo consiglio niente ROUND a meno che non debba mostrare il risultato all'utente.
Grazie delle spiegazioni e ciao
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: vuott - 10 Febbraio 2014, 23:17:26
.... paint.font.size (giustamente x me) se ne infischia del round e utilizza il valore completo del numero float

Comunque, io ho fatto una prova con un breve e semplice codice.... ed ho verificato che paint.font.size non ha problemi a conservare l'arrtondamento !  (http://levipere.com/wp-content/plugins/smilies-themer/Axendr/50-thumb.gif)
Titolo: Re: E' normale che Round non arrotondi?
Inserito da: Gianluigi - 11 Febbraio 2014, 13:58:36
.... paint.font.size (giustamente x me) se ne infischia del round e utilizza il valore completo del numero float

Comunque, io ho fatto una prova con un breve e semplice codice.... ed ho verificato che paint.font.size non ha problemi a conservare l'arrtondamento !  (http://levipere.com/wp-content/plugins/smilies-themer/Axendr/50-thumb.gif)

Scusa ma non potevi dimostrarla  ???

Comunque guardate un po qui io intravedo delle incongruenze fra il comportamento dei due tipi di ROUND con Quanti e senza  :rolleyes:

Codice: [Seleziona]
' Gambas class file

Public Sub _new()

End

Public Sub Form_Open()
 
 Dim f As Float
 
  da.Cached = True
  Paint.Begin(da)
 
  Paint.Font.Size = 11
  Print Paint.Font.Size ' ===> 11
 
  f = (11 * 0.744)
  Print f               '===> 8.184
 
  Paint.Font.size = f
  Print Paint.Font.size '===> 8.18359375
 
  f = Round(11 * 0.744)
  Print f               '===> 8
 
  Paint.Font.Size = f
  Print Paint.Font.size '===> 8
 
  Paint.Font.Size = Round(11 * 0.744)
  Print Paint.Font.size '===> 8
 
  Paint.Font.Size = Round(11 * 0.744)
  f = 1.3441
  Paint.Font.Size = Round(Paint.Font.Size * f)
  Print Paint.Font.size  '===> 11
 
  f = Round(11 * 0.744, -2)
  Print f                '===> 8.18
 
  Paint.Font.Size = f
  Print Paint.Font.size  '===> 8,1796875
 
  Paint.Font.Size = Round(11 * 0.744, -2)
  Print Paint.Font.size  '===> 8.1796875
 
  Paint.Font.Size = Round(11 * 0.744, -2)
  f = 1.3441
  Paint.Font.Size = Round(Paint.Font.Size * f, -2)
  Print Paint.Font.size  '===> 10.9892578125
  Paint.End

End