import java.math.BigDecimal; 



public class Arith { 



/** 

* 因为Java的简单类型不可以精确的对浮点数进行运算,这个工具类提供精 

* 确的浮点数运算,包含加减乘除和四舍五入。

*/ 

//默认除法运算精度 

private static final int DEF_DIV_SCALE = 10; 

    

//这个类不能实例化 

private Arith(){ 





    /** 

     * 提供精确的加法运算。

* @param v1 被加数 

     * @param v2 加数 

     * @return 两个參数的和 

     */ 

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

    } 

    /** 

     * 提供精确的减法运算。

* @param v1 被减数 

     * @param v2 减数 

     * @return 两个參数的差 

     */ 

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

    } 

    /** 

     * 提供精确的乘法运算。 

     * @param v1 被乘数 

     * @param v2 乘数 

     * @return 两个參数的积 

     */ 

    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位,以后的数字四舍五入。 

     * @param v1 被除数 

     * @param v2 除数 

     * @return 两个參数的商 

     */ 

    public static double div(double v1,double v2){ 

        return div(v1,v2,DEF_DIV_SCALE); 

    } 



    /** 

     * 提供(相对)精确的除法运算。当发生除不尽的情况时。由scale參数指 

     * 定精度。以后的数字四舍五入。 

     * @param v1 被除数 

     * @param v2 除数 

     * @param scale 表示表示须要精确到小数点以后几位。 

     * @return 两个參数的商 

     */ 

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

    } 



    /** 

     * 提供精确的小数位四舍五入处理。

* @param v 须要四舍五入的数字 

     * @param scale 小数点后保留几位 

     * @return 四舍五入后的结果 

     */ 

    public static double round(double v,int scale){ 

        if(scale<0){ 

            throw new IllegalArgumentException( 

                "The scale must be a positive integer or zero"); 

        } 

        BigDecimal b = new BigDecimal(Double.toString(v)); 

        BigDecimal one = new BigDecimal("1"); 

        return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); 

    } 

    

   /** 

    * 提供精确的类型转换(Float) 

    * @param v 须要被转换的数字 

    * @return 返回转换结果 

    */ 

    public static float convertsToFloat(double v){ 

    BigDecimal b = new BigDecimal(v); 

    return b.floatValue(); 

    } 

    

    /** 

* 提供精确的类型转换(Int)不进行四舍五入 

* @param v 须要被转换的数字 

* @return 返回转换结果 

*/ 

public static int convertsToInt(double v){ 

BigDecimal b = new BigDecimal(v); 

    return b.intValue(); 





/** 

* 提供精确的类型转换(Long) 

* @param v 须要被转换的数字 

* @return 返回转换结果 

*/ 

public static long convertsToLong(double v){ 

BigDecimal b = new BigDecimal(v); 

    return b.longValue(); 





/** 

* 返回两个数中大的一个值 

* @param v1 须要被对照的第一个数 

* @param v2 须要被对照的第二个数 

* @return 返回两个数中大的一个值 

*/ 

public static double returnMax(double v1,double v2){ 

BigDecimal b1 = new BigDecimal(v1); 

BigDecimal b2 = new BigDecimal(v2); 

    return b1.max(b2).doubleValue(); 





/** 

* 返回两个数中小的一个值 

* @param v1 须要被对照的第一个数 

* @param v2 须要被对照的第二个数 

* @return 返回两个数中小的一个值 

*/ 

public static double returnMin(double v1,double v2){ 

BigDecimal b1 = new BigDecimal(v1); 

BigDecimal b2 = new BigDecimal(v2); 

    return b1.min(b2).doubleValue(); 





/** 

* 精确对照两个数字 

* @param v1 须要被对照的第一个数 

* @param v2 须要被对照的第二个数 

* @return 假设两个数一样则返回0,假设第一个数比第二个数大则返回1,反之返回-1 

*/ 

public static int compareTo(double v1,double v2){ 

BigDecimal b1 = new BigDecimal(v1); 

BigDecimal b2 = new BigDecimal(v2); 

    return b1.compareTo(b2); 







}

数字精确运算BigDecimal经常用法的更多相关文章

  1. 精确运算--BigDecimal

    工具类 ,直接就可以使用,对于float和double的进行加减乘除长生的误差的解决办法. import java.math.BigDecimal; public class Arith { // 默 ...

  2. Java工具类(util) 之01- 数学运算工具(精确运算)

    数学运算工具(精确运算) /** * * @author maple * */ public abstract class AmountUtil { private AmountUtil() { } ...

  3. JS/PHP 浮点数精确运算

    php浮点数精确运算 bc是Binary Calculator的缩写.bc*函数的参数都是操作数加上一个可选的 [int scale],比如string bcadd(string $left_oper ...

  4. php浮点数精确运算

    php浮点数精确运算 Php: BCMath bc是Binary Calculator的缩写.bc*函数的参数都是操作数加上一个可选的 [int scale],比如string bcadd(strin ...

  5. java精确运算

    public class ArithUtil { /** * 加法 * @param * @return double * @throws Exception * @author zhangyn * ...

  6. C#实现大数字的运算

    1.添加引用:System.Numerics.dll 2.添加命名空间:using System.Numerics; 3.实例: 3.1判断一个数字是不是质数 static void Main(str ...

  7. 关于JS中判断是数字和小数的正则表达式用法

    关于JS中判断是数字和小数的正则表达式用法 正则表达式 正则表达式是由一个字符序列形成的搜索模式. 当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容. 正则表达式可以是一个简单的字符,或一 ...

  8. 使用BigDecimal进行精确运算以及格式化输出数字

    一.引言    借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供 ...

  9. BigDecimal的用法详解(保留两位小数,四舍五入,数字格式化,科学计数法转数字,数字里的逗号处理)

    转自:https://blog.csdn.net/ochangwen/article/details/51531866 一.简介 Java在java.math包中提供的API类BigDecimal,用 ...

随机推荐

  1. docker 集群 flannel网络构建

    先保证集群状态是正常的 集群管理 kubelet 在创建pod 时会先下载一个pause 镜像,这个镜像用于容器基础网络管理非常重要: 每个node 节点都要执行该操作: iptables -P FO ...

  2. Playing with String(codeforces 305E)

    题意:刚开始你只有一个字符串每次能选择一个有的字符串 s,找到 i,满足s[i - 1] = s[i + 1],将其分裂成 3 个字符串s[1 · · · i - 1]; s[i]; s[i + 1 ...

  3. MSP430 G2553 寄存器列表与引脚功能

    USCI_B0 USCI_B0 发送缓冲器UCB0TXBUF 06Fh USCI_B0 接收缓冲器UCB0RXBUF 06Eh USCI_B0 状态UCB0STAT 06Dh USCI B0 I2C ...

  4. 搞定linux的中文输入和vim

    本篇是http://blog.csdn.net/guochaoxxl/article/details/53212090的姊妹篇,无论先操作哪一篇都可以: 1.一言不合先下载,链接: https://p ...

  5. Ubuntu中vim添加lua支持

    系统:Ubuntu 15.10/16.04 因为Ubuntu15.10系统自带vim不支持lua,所以得自己编译安装. $ sudo apt install vim-nox vim-nox可以让vim ...

  6. RecyclerView的Item和Item内的控件点击处理

    需求场景:RecyclerView的Item需要点击,或者Item中的某个控件需要点击,或者两者同时需要点击处理. 一.adapter代码如下: package com.ldw.adapter; im ...

  7. 获取网页是手机端还是PC端访问

    C#方式: /// <summary> /// 是否手机访问 /// </summary> /// <returns></returns> public ...

  8. Codeforces Gym100814 B.Unlucky Teacher (ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (2015) Arab Academy for Science and Technology)

    今日份的训练题解,今天写出来的题没有昨天多,可能是因为有些事吧... 这个题就是老师改卷子,忘带标准答案了,但是他改了一部分卷子,并且确定自己改的卷子没出错,他想从改过的卷子里把标准答案推出来. 因为 ...

  9. weblogic10.3.6忘记用户名或者密码的解决方法

    weblogic安装后,忘记访问控制台的用户名或者密码,可通过以下步骤来重置用户名密码. 版本:WebLogic Server 10.3 说明:%DOMAIN_HOME%:指WebLogic Serv ...

  10. 初学Docker容器网络不得不看的学习笔记

    一.关于Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后 ...