2016-08-31 1 views
0

MathContext.DECIMAL32またはMathContext.DECIMAL64を使用しますか?私はdocumentationを見ましたが、どちらを使うかは本当に分かりませんでした。MathContext.DECIMAL32とMathContext.DECIMAL64のどちらを使用するのですか?その理由は何ですか?

私は金額に適用したい割合を表すためにBigDecimalを使用しています。このような何か:

... 
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); 
... 

私は、Ubuntuの14.04、インテルコアi7の(64)お使いのシステムのアーキテクチャに応じて、任意の64ビットタイプの操作のための命令セットが分割されます

+2

あなたはあなたではなくたMathContextを構築するよりも、それらのいずれかを使用する必要があります感じて任意の特定の理由あなたの要件に合った丸め? –

+0

@PatriciaShanahan私は32ビットと仮定しているJavaのネイティブ浮動小数点との互換性に関して懸念していると思います。 – has981

+0

Javaのネイティブ浮動小数点数は、10進数ではなく2進数であり、パーセント値を表すためにBigDecimalよりはるかに適していません。私はそのサイズが関係しているとは思わない。 –

答えて

0

をオラクルのJava 1.8を使用していますx64チップセットを使用していない場合は、2つのCPUにまたがります。あなたのIntel Core i7(x64)では、これに関する問題は無効になります。更新

:2016年1月9日

をJVM仕様割り当てによれば、任意の64ビット値の割り当てには、2つの32ビット割り当てを必要とします。

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

上記の仮定に基づいて、上記のgetNextIdの呼び出しはアトミックではありません。このクラスがマルチスレッドコンテキストで使用される場合、結果getNextId()は完全に正確ではない可能性があります。これらの呼び出しは、次のid 0,1,3,5,6,7,8,10を生成することがあります。 x86プラットフォーム上では、この動作は32ビットタイプでは得られません。更新2016年5月9日

がうまくいけば、次のリンクは、私の答えに役立ちます

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

+1

?正直なところ、私は今は物事を理解していると思うが、どういう意味ですか?例を挙げていただけますか?どのような "命令セットが2つのCPUに分割される"?つまり、32ビットシステムでは、異なるが補完的な命令セットを持つ2つのCPUがあります。 –

+0

私も混乱しています。 64ビットのメモリ操作を持たないプロセッサでは、2つの32ビットの負荷として64ビットの負荷が実装されるという問題があります。私が知る限り、CPU間で命令セットを分割することとは関係ありません。 –

+0

@PatriciaShanahan:ISTMは、 "命令セット"で、Jimは通常それが意味するものと全く異なる何かを意味します。 –

関連する問題