Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用BigDecimal乘以100哪个方法更好?_Java_Bigdecimal - Fatal编程技术网

Java 用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

在使用Java BigDecimal时,我有一个问题。 当我想为一个BigDecimal对象乘以100时,哪种方法更好

  • 乘以10两次
  • 右转(2)
  • scaleByPowerOfTen(2)
  • 还有别的办法吗?请告诉我有没有

  • 顺便说一句,它将用于商业计算,所以我考虑的是精度而不是速度

    选项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预热效果。你指出了一个很好的问题。事实上,我考虑的是计算的精确性而不是速度。