2016-08-31 2 views
0

Sollte ich MathContext.DECIMAL32 oder MathContext.DECIMAL64 verwenden? Ich habe mir die documentation angeschaut, aber ich konnte nicht wirklich verstehen, wann ich beides benutzen sollte.MathContext.DECIMAL32 vs MathContext.DECIMAL64, welche zu verwenden, und warum?

Ich benutze BigDecimal, um einen Prozentsatz darzustellen, den ich auf einen Geldbetrag anwenden möchte. Etwas wie folgt aus:

... 
final MathContext mc = MathContext.DECIMAL32; 
BigDecimal amount = getAmount(args); 
float percent = getPercent().floatValue(); 
BigDecimal percentAsBd = new BigDecimal(percent/100.f, mc).setScale(4, RoundingMode.HALF_UP); 
BigDecimal threshold = amount.multiply(percentAsBd); 
... 

Ich bin mit Oracle Java 1.8, Ubuntu 14.04, Intel Core i7 (64bit)

+2

einen besonderen Grund Sie das Gefühl einer von ihnen verwenden sollten, anstatt eine MathContext Konstruktion das entspricht Ihren Anforderungen für z Rundung? –

+0

@PatriciaShanahan Ich denke, ich bin besorgt über seine Kompatibilität mit Java nativen Float, die ich nehme, ist 32 Bit. – has981

+0

Der native Java-Gleitpfad ist binärbasiert, nicht dezimal, und ist viel weniger geeignet als BigDecimal, um Prozentwerte darzustellen. Ich denke nicht, dass seine Größe relevant ist. –

Antwort

0

Abhängig von Ihrer System-Architektur, die Befehlssatz für jede 64-Bit-Typ Betrieb wird aufgespalten werden über zwei CPUs, wenn Sie nicht auf einem x64-Chipsatz sind. Mit Ihrem Intel Core i7 (x64) werden alle Probleme umgangen.

Aktualisiert: 01/09/2016

Nach JVM Spezifikationen Zuordnung zu einer 64-Bit-Wertzuweisung erfordert zwei 32-Bit-Zuweisungen.

public class IdGenerator { 
    private long id; 
    public IdGenerator() { 
    id = 0; 
    } 
    public int getNextId() { 
    ++value; 
    } 
} 

Basierend auf dieser Annahme ist der obige Aufruf von getNextId nicht atomar. Wenn diese Klasse in einem Kontext mit mehreren Threads verwendet wird, ist das Ergebnis getNextId() möglicherweise nicht vollständig genau, z. Diese Aufrufe können die folgenden IDs 0,1,3,5,6,7,8,10 ergeben. Dieses Verhalten tritt bei einem 32-Bit-Typ auf einer x86-Plattform nicht auf.

aktualisieren 5/9/2016

Hoffentlich wird der folgende Link wird mit meiner Antwort helfen

http://preshing.com/20130618/atomic-vs-non-atomic-operations/

+1

Huh? Ehrlich gesagt glaube ich, dass ich die Dinge heute verstanden habe, aber was meinst du? Kannst du ein Beispiel geben? Welcher "Befehlssatz wird auf zwei CPUs aufgeteilt"? Sie meinen, dass beispielsweise in 32-Bit-Systemen zwei CPUs unterschiedliche, aber sich ergänzende Befehlssätze haben? –

+0

Ich bin auch verwirrt. Es gibt ein echtes Problem von 64-Bit-Lasten, die als zwei 32-Bit-Lasten auf Prozessoren implementiert werden, die keine 64-Bit-Speicheroperationen haben. Soweit ich weiß, hat das nichts damit zu tun, dass der Befehlssatz auf CPUs aufgeteilt wird. –

+0

@PatriciaShanahan: ISTM, dass Jim mit "Befehlssatz" etwas völlig anderes bedeutet als das, was normalerweise damit gemeint ist. –

Verwandte Themen