zoukankan      html  css  js  c++  java
  • 精确的浮点数运算(包括加、减、乘、除、四舍五入)的工具类

    package com.qiyuan.util;
    
    import java.math.BigDecimal;
    
    public class ArithUtil {
    
        // 除法运算默认精度  
        private static final int DEF_DIV_SCALE = 10;  
      
        private ArithUtil() {  
      
        }  
      
        /** 
         * 精确加法 
         */  
        public static double add(double value1, double value2) {  
            BigDecimal b1 = BigDecimal.valueOf(value1);  
            BigDecimal b2 = BigDecimal.valueOf(value2);  
            return b1.add(b2).doubleValue();  
        }  
      
        /** 
         * 精确减法 
         */  
        public static double sub(double value1, double value2) {  
            BigDecimal b1 = BigDecimal.valueOf(value1);  
            BigDecimal b2 = BigDecimal.valueOf(value2);  
            return b1.subtract(b2).doubleValue();  
        }  
      
        /** 
         * 精确乘法 
         */  
        public static double mul(double value1, double value2) {  
            BigDecimal b1 = BigDecimal.valueOf(value1);  
            BigDecimal b2 = BigDecimal.valueOf(value2);  
            return b1.multiply(b2).doubleValue();  
        }  
      
        /** 
         * 精确除法 使用默认精度 
         */  
        public static double div(double value1, double value2) throws IllegalAccessException {  
            return div(value1, value2, DEF_DIV_SCALE);  
        }  
      
        /** 
         * 精确除法 
         * @param scale 精度 
         */  
        public static double div(double value1, double value2, int scale) throws IllegalAccessException {  
            if(scale < 0) {  
                throw new IllegalAccessException("精确度不能小于0");  
            }  
            BigDecimal b1 = BigDecimal.valueOf(value1);  
            BigDecimal b2 = BigDecimal.valueOf(value2);  
            // return b1.divide(b2, scale).doubleValue();  
            return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();  
        }  
      
        /** 
         * 四舍五入 
         * @param scale 小数点后保留几位 
         */  
        public static double round(double v, int scale) throws IllegalAccessException {  
            return div(v, 1, scale);  
        }  
          
        /** 
         * 比较大小 
         */  
        public static boolean equalTo(BigDecimal b1, BigDecimal b2) {  
            if(b1 == null || b2 == null) {  
                return false;  
            }  
            return 0 == b1.compareTo(b2);  
        }  
        
        
        public static void main(String[] args) throws IllegalAccessException {
            double value1=1.2345678912311;
            double value2=9.1234567890123;
            BigDecimal value3=new BigDecimal(Double.toString(value1));
            BigDecimal value4=new BigDecimal(Double.toString(value2));
            System.out.println("精确加法================="+ArithUtil.add(value1, value2));
            System.out.println("精确减法================="+ArithUtil.sub(value1, value2));
            System.out.println("精确乘法================="+ArithUtil.mul(value1, value2));
            System.out.println("精确除法 使用默认精度 ================="+ArithUtil.div(value1, value2));
            System.out.println("精确除法  设置精度================="+ArithUtil.div(value1, value2,20));
            System.out.println("四舍五入   小数点后保留几位 ================="+ArithUtil.round(value1, 10));
            System.out.println("比较大小 ================="+ArithUtil.equalTo(value3, value4));
        }
    }
  • 相关阅读:
    最基础的账户余额要怎么在 mysql 实现?
    跳跃表时间复杂度分析推导
    Redis:RDB 中 fork 的使用
    字段、约束和索引在存储过程中的判断
    高效沟通的基本流程
    人月神话--画蛇添足
    课程评价及加分项
    人月神话--提纲挈领
    热词搜索七
    《大道至简:软件工程实践者的思想》
  • 原文地址:https://www.cnblogs.com/javahr/p/8321692.html
Copyright © 2011-2022 走看看