BigDecimal in Java

Ik denk aan het gebruik van BigDecimal om twee valutawaarden te vergelijken, afgerond op twee cijfers. Ik verwacht bijvoorbeeld dat het volgende 0 oplevert omdat ik iets vergelijk dat moet eindigen op 0,02 met iets dat 0,02 is. Maar het levert -1 op !! Is er een juiste manier om dit te doen?

Dit zou ook moeten werken voor grotere aantallen zoals 123.45 vs 123.4534 ... die 0 zouden moeten opleveren als "compareTo" wordt gebruikt.

Ik heb geprobeerd om wiskundige context te gebruiken, maar het lijkt niet elegant ... is er een juiste manier?

BigDecimal spread = new BigDecimal(0.01934);
spread.setScale(2, RoundingMode.HALF_EVEN);
System.out.format("0.0193 ? 0.02 = %d\n", spread.compareTo(new BigDecimal(0.02)));

EN DE OPLOSSING IS:

BigDecimal spread = new BigDecimal(0.01934).setScale(2, RoundingMode.HALF_EVEN);
BigDecimal loSpread = new BigDecimal(0.02).setScale(2, RoundingMode.HALF_EVEN);
System.out.format("0.0193 ? 0.02 = %d\n", spread.compareTo(loSpread));
7

2 antwoord

Ten eerste is BigDecimal onveranderbaar. U moet het resultaat van uw setScale methodeaanroep retourneren:

spread = spread.setScale(2, RoundingMode.HALF_EVEN);

Vervolgens moet u uw nauwkeurigheid van het tweede BigDecimal verbeteren, aangezien het wordt afgeleid van een dubbele - niet een zeer nauwkeurige entiteit. Dus probeer een String:

 spread.compareTo(new BigDecimal("0.02"))
10
toegevoegd
Ik heb de ongeldige bewerking teruggezet. Mensen, alsjeblieft reactie of geef een aanvullend antwoord als je niet tevreden bent met een antwoord dat je ziet.
toegevoegd de auteur class stacker, de bron
Dit wordt eigenlijk gebruikt om prijzen te vergelijken. Ze moeten mogelijk worden geïnstantieerd vanuit tweepersoonskamers.
toegevoegd de auteur fodon, de bron
@fodon: Gebruiker onbekend heeft een deel van je antwoord voor je, en ik heb het andere deel (met betrekking tot BigDecimal onveranderlijk).
toegevoegd de auteur Hovercraft Full Of Eels, de bron
@ClassStacker: bedankt!
toegevoegd de auteur Hovercraft Full Of Eels, de bron

0,02 wordt geëvalueerd naar

java.math.BigDecimal = 0.0200000000000000004163336342344337026588618755340576171875

Je moet daar ook Scale (2, RoundingMode.HALF_EVEN) instellen.

5
toegevoegd
Ik moest beide ideeën hier gebruiken om het goed te doen. Zal de juiste code plaatsen.
toegevoegd de auteur fodon, de bron
Dat is een andere manier om een ​​nauwkeurig drijvend kommagetal te krijgen. 1+.
toegevoegd de auteur Hovercraft Full Of Eels, de bron