Ho un problema con il confronto di due variabili di tipo "reale". Uno è il risultato di un'operazione matematica, memorizzato in un set di dati, il secondo è un valore di un campo di modifica in un modulo, convertito da StrToFloat e memorizzato nella variabile "Reale". Il problema è questo: Delphi - confronto di due variabili di numeri "reali"
Come si può vedere, il programma sta cercando di dirmi, che 121,97 non è uguale a 121,97 ... Ho letto this topic, e io non sono sicuro copletely , che è lo stesso problema. Se lo fosse, non sarebbero entrambi i numeri memorizzati nelle variabili come un numero rappresentativo esattamente identico, che per 121.97 è 121.96999 99999 99998 86313 16227 83839 70260 62011 71875
?
Ora diciamo che non vengono memorizzati come lo stesso numero rappresentabile più vicino. Come faccio a sapere in che modo sono memorizzati esattamente? Quando guardo nella finestra di debug della "CPU", sono completamente perso. Vedo gli indirizzi, dove questi valori dovrebbero essere, ma nulla di simile a qualche binario, esadecimale o qualsiasi rappresentazione del numero reale ... Ammetto che il debug avanzato è un universo sconosciuto per me ...
Modifica: questi due valori sono in realtà leggermente diversi.
OK, non ho bisogno di capire tutto. Anche se io non sto trattando con i soldi, non ci sarà un massimo di 3 cifre decimali, in modo da "moneta" è la via d'uscita
BTW: Il calcolo è:
DATA[i].Meta.UnUsedAmount := DATA[i].AMOUNT - ObjQuery.FieldByName('USED').AsFloat;
In questo caso è 3695-3573,03
Vedere JIRA RSP-13792. Potresti voler invocare la funzione 'comparevalue'. – Magoo
@Magoo Quella relazione è falsa. Il compilatore si comporta correttamente. –
'StrToFloat' dovrebbe comportarsi come dici tu.Ma per quanto riguarda l'altro valore? Come è calcolato. Penso che dovresti concentrarti sul problema reale, che non possiamo vedere. –