Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Arrotondamento

  1. #1

    Arrotondamento

    Tento di usare NumberFormat per mostrare i numeri. Ecco il codice

    codice:
    		NumberFormat nf = NumberFormat.getInstance();
    		nf.setMaximumFractionDigits(2);
    		nf.setMinimumFractionDigits(2);
    		System.out.println(nf.format(128.235));
    Questo per mostrare due cifre dopo la virgola. Il problema
    e' che l'arrotondamento utilizzato non e' quello classico, ma nel caso di "5" come prima cifra da tagliare, il numero viene arrotondato alla cifra corrente e non a quella successiva, come dovrebbe essere.

    Nell'esempio, il risultato e' 128,23 anzicchè 128,24. Qualcuno sa come cambiare il tipo di arrotondamento nel NumberFormat?

    Grazie in anticipo.
    ciao ciao !!
    _______________
    home : cristianolongo.altervista.org
    e-mail : cristiano_longo@yahoo.it

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303
    Uhm... un bel problemino.
    Non so se dipenda dal parametro Locale di getInstance() (magari provando a passare un parametro diverso si risolve, ma dubito fortemente).

    Una soluzione che mi viene in mente così, su due piedi, prevede di costruire una classe ad hoc, che estenda NumberFormat e che sottoponga ad override il metodo format() in modo che l'arrotondamento avvenga con le politiche convenzionali. (Basta controllare che la cifra successiva a quella per cui si desidera arrotondare sia 5 e fare le dovute correzioni...)


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Caro Gabriele, il problema della soluzione da te proposta e' che taglia un po' le gambe all'utilizzo di NumberFormat.
    Specificando getInstance senza argomento, viene infatti preso il Locale di default. Il che significa che il numero verrà visualizzato direttamente a seconda della lingua del computer sul quale gira il programma.

    codice:
    NumberFormat nf = NumberFormat.getInstance();
    ciao ciao !!
    _______________
    home : cristianolongo.altervista.org
    e-mail : cristiano_longo@yahoo.it

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303
    Originariamente inviato da cristiano_longo
    Caro Gabriele, il problema della soluzione da te proposta e' che taglia un po' le gambe all'utilizzo di NumberFormat.
    Specificando getInstance senza argomento, viene infatti preso il Locale di default. Il che significa che il numero verrà visualizzato direttamente a seconda della lingua del computer sul quale gira il programma.

    codice:
    NumberFormat nf = NumberFormat.getInstance();
    Ciao... (non mi chiamo Gabriele! )
    Lo so che la soluzione da me proposta taglia un po' le gambe al NumberFormat... ma era solametne una soluzione alternativa... non so come mai l'arrotondamento non venga effettuato nel modo canonico (non ho nemmno guardato il sorgente di NumberFormat), ma probabilmente i progettisti della classe hanno commesso un piccolo errore oppure non sapevano arrotondare!!
    E vogliamo, per questo, avere delle applicazioni che funzionano male? :gren:


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,288
    Non so se può essere utile al tuo caso, ma occorre stare attenti agli arrotondamenti all'interno di un'applicazione specialmente nel caso in cui si abbia a che fare con delle "valute".

    Oltre al classico errore di precisione che potrebbe influenzare l'arrotondamento di un valore, c'è anche l'algoritmo del "Banker's Rounding", spesso interpretato come bug, che può influenzare l'arrotondamento stesso fornendo un risultato diverso da quello che ci si aspetta.

    In generale, se non diversamente specificato, le CPU arrotondano al numero pari più vicino; se arrotondi all'interno il valore 0.5 ti verrà restituito 0, se arrotondi 1 ti verrà restituito 1, se arrotondi 1.5 ti verrà restituito 2 e così via. In definitiva, non arrotonda all'intero superiore come avviene normalmente nel campo finanziario.

    Questo non sembra essere il tuo caso, ma potrebbe trattarsi di un errore magari generato dal tipo di dato sbagliato che viene rappresentato nella CPU con un errore che ne impedisce il corretto arrotondamento così come lo intendi tu.

    Spero di aver comunque dato indicazioni utili in generale.

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

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

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