Italian trasformare un importo in un intero

sirjo66

Well-Known Member
Licensed User
Longtime User
Salve a tutti

Nel realizzare un'applicazioncina ho avuto la necessità di memorizzare degli importi in un db SQLite. Ho pensato di definire il campo (della tabella sqlite) come intero quindi moltiplicare gli importi * 100 e registrali nel DB per poi dividerli per 100 quando vado a ripescarli dal db.
Nel fare questo mi sono imbattuto in una cosa curiosa
B4X:
Dim l As Long
Dim d As Double

d = 1250.60
l = d * 100
Msgbox(l, "")

quando d vale 1250.60 moltiplicato * 100 fornisce 125059 !!!!!
una spiegazione per l'arcano?

un saluto

p.s. provare per credere

Comunque sinceramente non vedo il problema, quel 0,00000000001 anche se si perde non cambia il discorso del valore (l'errore è davvero minimo), il problema è che Fabio, quando ha fatto la conversione da Double a Long, ha fatto una semplice troncatura del valore invece che fare un arrotondamento, in questo caso non perdeva praticamente nulla.

B4X:
Dim l As Long
Dim d As Double

d = 1250.60
l = Round(d * 100)
Msgbox(l, "")

Con questo codice esce correttamente 125060

Sergio
 
Last edited:

sirjo66

Well-Known Member
Licensed User
Longtime User
Mi dispiace contraddirti Luca (sennò a cosa serve un forum ??) ma anche in VB.NET hai lo stesso problema !!!
(infatti non è un problema di linguaggio, è il sistema di come si memorizzano i double con il sistema di mantissa/esponente)

Su VB.NET:
B4X:
  Dim D As Double = 1250.6
  D = D * 100
  Stop

Manda in esecuzione questo programma (che è lo stesso che avevi fatto tu) e quando il programma si blocca, sposta il mouse sopra alla variabile D e ti mostrerà il suo valore corretto (cioè quello memorizzato nella RAM) e vedrai che ti dice che la variabile D vale 125059.99999999999

Se poi vuoi visualizzare a video o (come hai fatto tu) un bel Debug.Print allora VB.NET eseguirà per te un arrotondamento, che è la stessa cosa che ho fatto io introducendo la funzione Round nel listato B4A

;)

Sergio
 

cimperia

Active Member
Licensed User
Longtime User
Non ci sono problemi reali. L'unico problema è la formattazione: implicita o esplicita che ci fanno pensare che i valori sono sbagliati.
 
Last edited:

fabio_linate_milano

Member
Licensed User
Longtime User
ho fatto la prova del primo link
upload_2015-10-6_15-16-16.png
 
Top