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();
    
        }
    
    }
    



  • 相关阅读:
    IIS部署.net core 的程序后,如何查看控制台的日志?
    Java中string的编码的详细说明
    explicit禁止被用来执行隐式类型转换。仍可以进行显示转换
    判断一个IP字符串为有效的IP方法
    链接原理
    tcp套接字地址
    c/c++中的__attribute__((weak))使用
    关于multiple definition of 错误说明很详细的文章【转载】
    c/c++中结构体中的位域在大小端设备上的内存存储方式----------位域
    TCP之数据缓冲区大小及其限制
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3249199.html
Copyright © 2011-2022 走看看