Java 用BigDecimal乘以100哪个方法更好?
在使用Java BigDecimal时,我有一个问题。 当我想为一个BigDecimal对象乘以100时,哪种方法更好Java 用BigDecimal乘以100哪个方法更好?,java,bigdecimal,Java,Bigdecimal,在使用Java BigDecimal时,我有一个问题。 当我想为一个BigDecimal对象乘以100时,哪种方法更好 乘以10两次 右转(2) scaleByPowerOfTen(2) 还有别的办法吗?请告诉我有没有 顺便说一句,它将用于商业计算,所以我考虑的是精度而不是速度 选项3是最快的。选项1和选项2大致相同(选项1是乘以10的两倍)。相反,乘以100的速度接近选项3的速度 以下是我的测试代码: import java.math.BigDecimal; public class Tes
顺便说一句,它将用于商业计算,所以我考虑的是精度而不是速度 选项3是最快的。选项1和选项2大致相同(选项1是乘以10的两倍)。相反,乘以100的速度接近选项3的速度 以下是我的测试代码:
import java.math.BigDecimal;
public class TestingStuff {
public static void main(String[] args){
BigDecimal d2 = new BigDecimal(0); // to load the big decimal class outside the loop
long start = System.currentTimeMillis();
for(int i = 0; i < 1000000; i++) {
BigDecimal d = new BigDecimal(99);
d2 = d.movePointRight(2);
}
long end = System.currentTimeMillis();
System.out.println("movePointRight: " + (end - start));
BigDecimal ten = new BigDecimal(10);
start = System.currentTimeMillis();
for(int i = 0; i < 1000000; i++) {
BigDecimal d = new BigDecimal(99);
d2 = d.multiply(ten).multiply(ten);
}
end = System.currentTimeMillis();
System.out.println("multiply: " + (end - start));
start = System.currentTimeMillis();
for(int i = 0; i < 1000000; i++) {
BigDecimal d = new BigDecimal(99);
d2 = d.scaleByPowerOfTen(2);
}
end = System.currentTimeMillis();
System.out.println("scaleByPowerOfTen: " + (end - start));
}
}
import java.math.BigDecimal;
公共类测试工具{
公共静态void main(字符串[]args){
BigDecimal d2=新的BigDecimal(0);//在循环外加载大十进制类
长启动=System.currentTimeMillis();
对于(int i=0;i<1000000;i++){
BigDecimal d=新的BigDecimal(99);
d2=d.movePointRight(2);
}
long end=System.currentTimeMillis();
System.out.println(“movePointRight:+(end-start));
BigDecimal十=新的BigDecimal(10);
start=System.currentTimeMillis();
对于(int i=0;i<1000000;i++){
BigDecimal d=新的BigDecimal(99);
d2=d.乘(十)次.乘(十);
}
end=System.currentTimeMillis();
System.out.println(“乘法:”+(结束-开始));
start=System.currentTimeMillis();
对于(int i=0;i<1000000;i++){
BigDecimal d=新的BigDecimal(99);
d2=d.标度比功率(2);
}
end=System.currentTimeMillis();
System.out.println(“scaleByPowerOfTen:+(end-start));
}
}
当然,您可以自己在自己的代码中尝试各种选项。如果你不能测量差异,那你为什么要优化呢?我会说#2或#3——我怀疑这两者几乎是等价的。我不确定为什么你会乘以10两次,而不是乘以100一次。是的,好问题,我只是拿它作为例子。事实上,我有一个十进制控制的参数,+1使用了你的测试工具和我的multiplyOneHundred,“multiplyOneHundred:160”,“multiplyOneHundred:87”,“scaleByPowerOfTen:21”我觉得必须指出你的测试是。使用currentTimeMillis,没有对结果做任何事情,这样编译器就可以重构所有的东西,并且BigDeCimple类被加载到第一个循环中。这个基准的另一个问题是它不允许JVM预热效果。你指出了一个很好的问题。事实上,我考虑的是计算的精确性而不是速度。