MathContext.DECIMAL32与MathContext.DECIMAL64,哪一个使用,为什么?

时间:2016-08-31 09:57:56

标签: java floating-point bigdecimal mathcontext

我应该使用MathContext.DECIMAL32还是MathContext.DECIMAL64?我查看了documentation,但我真的不明白何时使用它们。

我使用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);
...

我使用的是oracle java 1.8,ubuntu 14.04,Intel core i7(64bit)

1 个答案:

答案 0 :(得分:0)

根据您的系统架构,如果您不在x64芯片组上,则任何64位类型操作的指令集将分为两个CPU。使用英特尔酷睿i7(x64)时,任何与此相关的问题都将被否定。

更新时间:01/09/2016

根据JVM规范,分配给任何64位值赋值需要两次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/