Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [ANDROID] Dividere la parte intera da quella decimale

    ciao come da titolo dovrei leggere una EditText e dividere la parte intera da quella decimale

    leggo il numero inserito tramite
    depoNum = Float.valueOf(tDispNumIn.getText().toString());

    leggo la parte intera
    depoInt = depoNum.intValue();

    calcolo la parte decimale
    depoDec = depoNum-depoInt;

    se io digito 123.4 la parte intera 123 perfetto, mentre come parte decimale 0.40000153

    non capisco il perche
    Immagini allegate Immagini allegate

  2. #2
    Utente di HTML.it L'avatar di Misterxxx
    Registrato dal
    Oct 2003
    Messaggi
    3,591
    credo dovresti valutare l'uso di BigDecimal, una cosa tipo:
    depoNum = new BigDecimal(tDispNumIn.getText().toString());
    Io ne ho viste cose che voi umani non potreste immaginare. Navi da combattimento in fiamme al largo dei bastioni di Orione e ho visto i raggi B, balenare nel buio vicino le porte di Tannhäuser. E tutti quei momenti ... andranno ... perduti nel tempo, come lacrime nella pioggia. È tempo di morire. (Roy Batty).

  3. #3
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,567
    In matematica fai 1/3 risulta 0.3333333333..... (infiniti 3)
    Lo stesso vale nel pc, che però non utilizza la base 10 ma la base 2, quindi succede con dei numeri diversi.
    Essendo che lo spazio in un computer è finito (di solito 64bit) alcune cifre vanno perse e ci sono artefatti di vario tipo dovuti agli arrotondamenti.
    L'esempio classico è 1.0 == (0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1) è falso

    Ho cercato di spiegarlo in modo semplice ma forse ho perso di chiarezza per aver semplificato troppo. Ad ogni modo se vuoi approfondire è un tema ampiamente trattato.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  4. #4
    scara95 scusami ma non riesco a capire quello che dici con la mia richiesta semplice "separare la parte intera dalla parte decimale"

    ho semplificato la cosa al massimo scrivendo


    Float depoNum, depoDec, depoInt;


    depoNum = 123.4;
    depoInt = 123.0;
    depoDec = depoNum-depoInt;


    se visualizzo depoDec con: tDispOutDec.setText(depoDec.toString());

    ottengo 0.4000000057

  5. #5
    Utente di HTML.it L'avatar di Misterxxx
    Registrato dal
    Oct 2003
    Messaggi
    3,591
    scara95 ti voleva spiegare il motivo del problema
    per questo l'uso della classe BigDecimal dovrebbe aiutarti dato che serve proprio per la gestione più accurata dei decimali dopo la virgola
    Io ne ho viste cose che voi umani non potreste immaginare. Navi da combattimento in fiamme al largo dei bastioni di Orione e ho visto i raggi B, balenare nel buio vicino le porte di Tannhäuser. E tutti quei momenti ... andranno ... perduti nel tempo, come lacrime nella pioggia. È tempo di morire. (Roy Batty).

  6. #6
    ok scusa

    queste tre righe
    BigDecimal depoNum;
    depoNum = new BigDecimal(123.4);
    Log.i("depoNum","risultato " + depoNum);

    mi danno come risultato
    I/debug: risultato 123.400000000000005684341886080801486968994140625
    Ultima modifica di macslacky; 04-03-2020 a 15:39

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,359
    mi danno come risultato


    Certo ... ancora per il motivo che ti ha spiegato Scara95.

    Il valore 0,4 decimale trasformato in binario diventa un valore periodico
    0.0110010011.. con 0011 finale che si ripete sempre. Quindi NON si può esprimere in maniera precisa in binario come in decimale non puoi esprimere il valore 1/3 e quindi non lo avrai mai in output.

    Quando visualizzi il valore, non usare tutte le cifre decimali possibili, ma usa una approssimazione alle cifre decimali che ti servono (ad esempio, se approssimi alle prime 5 cifre decimali, avrai in output 123.40000 ovvero 123.4, quello che ti serve ...)
    Ultima modifica di oregon; 05-03-2020 a 13:00
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it L'avatar di Misterxxx
    Registrato dal
    Oct 2003
    Messaggi
    3,591
    Quote Originariamente inviata da macslacky Visualizza il messaggio
    ok scusa

    queste tre righe
    BigDecimal depoNum;
    depoNum = new BigDecimal(123.4);
    Log.i("depoNum","risultato " + depoNum);

    mi danno come risultato
    I/debug: risultato 123.400000000000005684341886080801486968994140625
    La precisione della classe BigDecimal si ottiene con l'argomento string:
    depoNum = new BigDecimal("123.4");
    Io ne ho viste cose che voi umani non potreste immaginare. Navi da combattimento in fiamme al largo dei bastioni di Orione e ho visto i raggi B, balenare nel buio vicino le porte di Tannhäuser. E tutti quei momenti ... andranno ... perduti nel tempo, come lacrime nella pioggia. È tempo di morire. (Roy Batty).

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 © 2020 vBulletin Solutions, Inc. All rights reserved.