zoukankan      html  css  js  c++  java
  • java 加减乘除错误

    有次做一个for循环(1000次左右),做的事情也是很简单的事情,就是   Double testValue = (long类型 / 8 ) * long类型 的一些加减乘除操作,

    但是总是出现一些数据算的不对,大部分出现数据丢失了,出现了这样一个情况 (100/8)* 60 本来等于750 ,在for中却是720 。

    写个Uitls类吧,使用BigDecimal处理。这个Utils可以继续add的。

    package com.sencloud.dh.core.utils;
    
    import java.math.BigDecimal;
    
    /**
     * 算法工具类
     * <一句话功能简述>
     * <功能详细描述>
     * 
     * @author  xutianlong
     * @version  [版本号, Aug 9, 2013]
     * @see  [相关类/方法]
     * @since  [产品/模块版本]
     */
    public class AlgorithmUtil
    {
        private static final int DEF_DIV_SCALE = 10;
    
        /**
         * * 两个Double数相加 *
         * 
         * @param v1 *
         * @param v2 *
         * @return Double
         */
        public static Double add(Double v1, Double v2)
        {
            BigDecimal b1 = new BigDecimal(v1.toString());
            BigDecimal b2 = new BigDecimal(v2.toString());
            return b1.add(b2).doubleValue();
        }
    
        /**
         * * 两个Double数相加 *
         * 
         * @param v1 *
         * @param v2 *
         * @return Double
         */
        public static Double add(Long v1, Long v2)
        {
            BigDecimal b1 = new BigDecimal(v1.toString());
            BigDecimal b2 = new BigDecimal(v2.toString());
            return b1.add(b2).doubleValue();
        }
    
        /**
         * * 两个Double数相减 *
         * 
         * @param v1 *
         * @param v2 *
         * @return Double
         */
    
        public static Double sub(Double v1, Double v2)
        {
            BigDecimal b1 = new BigDecimal(v1.toString());
            BigDecimal b2 = new BigDecimal(v2.toString());
            return b1.subtract(b2).doubleValue();
        }
    
        /**
         * * 两个Double数相乘 *
         * 
         * @param v1 *
         * @param v2 *
         * @return Double
         */
        public static Double mul(Double v1, Double v2)
        {
            BigDecimal b1 = new BigDecimal(v1.toString());
            BigDecimal b2 = new BigDecimal(v2.toString());
            return b1.multiply(b2).doubleValue();
        }
        
        /**
         * * 两个数相乘 *
         * 
         * @param v1 *
         * @param v2 *
         * @return Double
         */
        public static Double mul(Double v1, Long v2)
        {
            BigDecimal b1 = new BigDecimal(v1.toString());
            BigDecimal b2 = new BigDecimal(v2.toString());
            return b1.multiply(b2).doubleValue();
        }
    
        /**
         * * 两个Double数相除 *
         * 
         * @param v1 *
         * @param v2 *
         * @return Double
         */
    
        public static Double div(Double v1, Double v2)
        {
            BigDecimal b1 = new BigDecimal(v1.toString());
            BigDecimal b2 = new BigDecimal(v2.toString());
            return b1.divide(b2, DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
        }
        /**
         * * 两个Double数相除 *
         * 
         * @param v1 *
         * @param v2 *
         * @return Double
         */
    
        public static Double div(Double v1, Long v2)
        {
            BigDecimal b1 = new BigDecimal(v1.toString());
            BigDecimal b2 = new BigDecimal(v2.toString());
            return b1.divide(b2, DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
        }
        /**
         * * 两个Long数相除 *
         * 
         * @param v1 *
         * @param v2 *
         * @return Double
         */
    
        public static Double div(Long v1, Long v2)
        {
            BigDecimal b1 = new BigDecimal(v1.toString());
            BigDecimal b2 = new BigDecimal(v2.toString());
            return b1.divide(b2, DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
        }
        
    
        /**
         * * 两个Double数相除,并保留scale位小数 *
         * 
         * @param v1 *
         * @param v2 *
         * @param scale *
         * @return Double
         */
    
        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(v1.toString());
    
            BigDecimal b2 = new BigDecimal(v2.toString());
    
            return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    
        }
    
    }
    



  • 相关阅读:
    拼接带有汉字的html接口时应注意的问题
    引入第三方友盟分享出现的问题
    修改系统文件内容的经典错误总结
    实例变量 、 属性 、便利构造器、设置器、 访问器、实例方法("-") 、类方法("+"静态方法)、单例
    iOS开发 调用打电话,发短信
    UINavigationController的相关设置
    “商城项目”自定义搜索框
    下拉刷新,上拉加载更多
    NSArray数组随机排序
    面向对象概念
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3249199.html
Copyright © 2011-2022 走看看