Perché il codice di divisione intero dà la risposta sbagliata?

Ho una divisione molto semplice in Java (è una quantità / produzione del prodotto all’ora), tuttavia ogni volta che faccio questa divisione ottengo strani errori:

float res = quantity / standard; 

Ho provato la divisione di cui sopra con diversi valori e ottengo sempre errori, tuttavia quello che ho provato ovunque e ottenuto correttamente è stato questo:

Ovunque nel mondo:

 13.6 = 6800 / 500; 

Giava:

 13.0 = 6800 / 500; 

Ho ricercato BigDecimal e BigInteger, tuttavia non ho trovato un modo per creare questa divisione con loro, c’è qualche altro modo per fare questa divisione in Java senza errori di precisione ??

Qualsiasi aiuto sarà molto apprezzato.

    Stai dividendo gli interi, il che significa che stai usando la divisione di interi .

    Nella divisione intera la parte frazionaria del risultato viene gettata via.

    Prova quanto segue:

     float res = (float) quantity / standard; ^^^^^^^ 

    Quanto sopra costringe il numeratore a essere trattato come un float che a sua volta promuove il denominatore anche a fluttuare, e viene eseguita una divisione float invece di una int-division.

    Nota che se hai a che fare con letterali, puoi cambiare

     float f = 6800 / 500; 

    per includere il suffisso f per rendere il denominatore un float:

     float f = 6800f / 500; ^ 

    Se ti preoccupi della precisione, ti suggerisco di usare il double che ha più del doppio del numero di cifre di precisione. Tuttavia, il punto mobile rappresenta solo accuratamente le frazioni che sono una sum o potenze di 0,5. Ciò significa che 0,6 è rappresentato solo approssimativamente. Questo non deve essere un problema con arrotondamento appropriato.

     double d = (double) 6800 / 500; 

    o

     double d = 6800.0 / 500; 

    ciao prova questo può aiutare a soddisfare le vostre esigenze

     double percent=(7819140000l-3805200000l)*100f/7819140000l; public String format_Decimal(double decimalNumber) { NumberFormat nf = NumberFormat.getInstance(); nf.setMaximumFractionDigits(5); nf.setMinimumFractionDigits(2); nf.setRoundingMode(RoundingMode.HALF_UP); String x = nf.format(decimalNumber); return x; } 

    Nel mio caso stavo facendo questo:

     double a = (double) (MAX_BANDWIDTH_SHARED_MB/(qCount+1)); 

    Invece del “corretto”:

     double a = (double)MAX_BANDWIDTH_SHARED_MB/(qCount+1);