Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    13

    [Delphi] Leggere Record (Double) da File

    Salve a tutti, durante la progettazione del mio programma sono incappato in un evento non previsto. Una soluzione l'ho trovata, ma non riesco a capire come mai accada ciò che succede.
    Ho un file di record, dove salvo dei dati da delle edit.
    I dati del record sono di vari tipi: stringhe, interi, double. Il problema si verifica in fase di lettura. Mentre le stringhe e gli interi vengono letti con esattezza, i dati di tipo double vengono letti con numeri in eccesso e a caso(caso?) come se non fossero stati arrotondati.
    Faccio un esempio:
    Se scrivo ad esempio che l'altezza di una persona è 1.65, quando vado a leggere il record mi compare scritto 1.64999998989498.
    Come mai succede questo? E' possibile evitarlo o sono costretto a salvare i dati come stringhe e riconvertirli successivamente?
    Ps: Se ai dati di tipo double assegno un numero senza virgola vengono letti correttamente però.

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    I dati che appartengono ai tipi di valore in virgola mobile sono sempre inficiati dall'errore di precisione della CPU.

    I valori che leggi dal file di testo sono già tali quando li acquisisci o li assegni da codice.

    Ti basta formattare il valore che acquisisci semplicemente applicando un arrotondamento tra quelli disponibili.

    Comunque sia, posta anche il codice che hai scritto se occorrono ulteriori indicazioni, così abbiamo un riferimento preciso.

    Prova anche a sostituire il tipo Double con Currency.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    13
    Ok grazie, ho capito il problema.
    Adesso che mi è chiaro il perché succede sono riuscito a trovare anche la soluzione sfogliando le altre discussioni.
    Ho utilizzato la funzione SimpleRoundTo (come avevi suggerito in un'altra discussione) e sono riuscito ad approssimare in modo perfetto.

    Grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.