opinioni sulla primitiva da doppia a lunga aggiunta e torna di nuovo a raddoppiare?

-3

Opinioni sull'affidabilità / redditività di fare qualcosa del genere per risolvere il problema delle stranezze IEEE in aggiunta e sottrazione, ecc ...? Voglio evitare BigDecimal, Formatters, ecc ... GC overhead

esplorare questa idea.

int fivePlaces = 100000;
Assert.assertEquals(1.13269, add(1.13270, -0.00001, fivePlaces), 0);

private double add(double aPrice,
                   double aModifier,
                   double aPrecision) {
    long price = (long) (aPrice * aPrecision);
    long modifier= (long) (aModifier * aPrecision);
    long adjustedPrice = price + modifier;
    return adjustedPrice / aPrecision;
}

ad esempio:

    double d = 1.30784;
    double d2 = -0.00005;
    double d3 = d + d2;
    double d4 = add(d, d2, 100000);
    System.out.println(d3);
    System.out.println(d4);

l'idea è di evitare questo risultato: 1,3077899999999998

e prendi questo: 1,30,778 mila

con i primitivi.

    
posta andmer 22.09.2016 - 21:25
fonte

1 risposta

5

Il numero 1.30778 non può essere rappresentato esattamente come un doppio. Per questo numero, la rappresentazione più accurata sarà 0x3FF4ECAAB8A5CE5B che è 1.30777999999999994251709267701 .

Il problema principale con questo è non utilizzare un doppio per archiviare i soldi . Qualsiasi utilizzo di un numero in virgola mobile avrà intrinsecamente problemi con importi monetari.

Succhialo e usa un BigDecimal.

Vedi anche:

risposta data 22.09.2016 - 22:03
fonte

Leggi altre domande sui tag