1

我应该使用MathContext.DECIMAL32orMathContext.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);
...

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

4

1 回答 1

0

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

更新时间:2016 年 1 月 9 日

根据 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/

于 2016-08-31T11:44:59.170 回答