Javaにおける小数の正確な処理について


JAvaではBigDecimalの小数に対する正確な処理を提供する
a)通常、2桁の小数を保留し、四捨五入する方法が用いられる.
setScale(int newScale, int roundingMode)
- newScale:       
- roundingMode:      

roundingModeの値はいくつかあります.
  • ROUND_CEILINGがこの数に等しいその最近値
  • より大きい
  • ROUND_DOWNの正数はその数以下の最近接数であり、負数はその数以上の最近接数
  • である.
  • ROUND_FLOORがその数に等しい値
  • より小さい
  • ROUND_HALF_DOWN五舎六入
  • ROUND_HALF_EVENは、両側が等しい場合を除き、最も近い側に切り込みます.そうであれば、保持ビット数が奇数の場合は、ROUND_を使用します.HALF_UP、偶数ならROUND_を使用HALF_DOWN
  • ROUND_HALF_UP四捨五入
  • ROUND_UNNECESSARYの計算結果は正確であり、丸めモード
  • を必要としない.
  • ROUND_UPとROUND_DOWN逆
  • doubleタイプの小数については、2桁の小数を保持し、四捨五入します.
      public static double round(double value) {
            return round(value, 2, BigDecimal.ROUND_HALF_UP);
        }
    
        /**
         *  double       
         * @param value double  
         * @param scale     (       )
         * @param roundingMode       
         * @return         
         */
        public static double round(double value, int scale, int roundingMode) {
            BigDecimal bd = new BigDecimal(value);
            bd = bd.setScale(scale, roundingMode);
            double d = bd.doubleValue();
            bd = null;
            return d;
        }

    BigDecimalを使用する小数の正確な加算、減算、乗算、除算.
    public class PreciseCompute {  
    //          
    private static final int DEF_DIV_SCALE = 10;  
      
    /** 
    *          。 
    */  
    public static double add(double v1, double v2) {  
       BigDecimal b1 = new BigDecimal(Double.toString(v1));  
       BigDecimal b2 = new BigDecimal(Double.toString(v2));  
       return b1.add(b2).doubleValue();  
    }  
      
    /** 
    *          。 
    */  
    public static double sub(double v1, double v2) {  
       BigDecimal b1 = new BigDecimal(Double.toString(v1));  
       BigDecimal b2 = new BigDecimal(Double.toString(v2));  
       return b1.subtract(b2).doubleValue();  
    }  
      
    /** 
    *          。 
    */  
    public static double mul(double v1, double v2) {  
       BigDecimal b1 = new BigDecimal(Double.toString(v1));  
       BigDecimal b2 = new BigDecimal(Double.toString(v2));  
       return b1.multiply(b2).doubleValue();  
    }  
      
    /** 
    *   (  )       ,          ,    
    *      10 ,         。 
    */  
    public static double div(double v1, double v2) {  
       return div(v1, v2, DEF_DIV_SCALE);  
    }  
      
    /** 
    *   (  )       。          , scale    
    *    ,         。 
    */  
    public static double div(double v1, double v2, int scale) {  
       if (scale < 0) {  
        throw new IllegalArgumentException(  
          "The scale must be a positive integer or zero");  
       }  
       BigDecimal b1 = new BigDecimal(Double.toString(v1));  
       BigDecimal b2 = new BigDecimal(Double.toString(v2));  
       return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();  
     }  
    }  

    小demoを運用する
    private BigDecimal formatComma2BigDecimal(Object obj) {  
            String val = String.valueOf(obj);  
            if (val == null)  
                return new BigDecimal("0.00");  
      
            val = val.replaceAll(",", "");  
            if (!isNumber(val))  
                return new BigDecimal("0.00");  
      
            BigDecimal decimal = new BigDecimal(val);  
            decimal = decimal.setScale(2, RoundingMode.HALF_UP);  
      
            return decimal;  
      
        }  
        private String formatCommaAnd2Point(Object obj) {  
            BigDecimal decimal = formatComma2BigDecimal(obj);  
      
            DecimalFormat df = new DecimalFormat("#,###.00");  
            String decimalStr = df.format(decimal).equals(".00")?"0.00":df.format(decimal);  
            if(decimalStr.startsWith(".")){  
                decimalStr = "0"+decimalStr;  
            }  
            return decimalStr;  
        }  
        private boolean isDouble(String value) {  
            try {  
                Double.parseDouble(value);  
                if (value.contains("."))  
                    return true;  
                return false;  
            } catch (NumberFormatException e) {  
                return false;  
            }  
        }  
        private boolean isInteger(String value) {  
            try {  
                Integer.parseInt(value);  
                return true;  
            } catch (NumberFormatException e) {  
                return false;  
            }  
        }  
        private boolean isNumber(String value) {  
            return isInteger(value) || isDouble(value);  
        }