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. 【Luogu】P2824排序(二分答案+线段树排序)

    题目链接 震惊!两个线段树和一个线段树竟是50分的差距! 本题可以使用二分答案,二分那个位置上最后是什么数.怎么验证呢? 把原序列改变,大于等于mid的全部变成1,小于mid的全部变成0,之后线段树排 ...

  2. [atcoder002E] Candy Piles [博弈论]

    题面: 传送门 思路: 每一堆糖排成一列,所有列横着放,形成一个阶梯型 两个决策相当于左边一列去掉和最下面一行去掉 那么这个模型可以转化为同样形状的网格图,向左上方走,走到边界的赢· 然后一波数学推导 ...

  3. df du 的区别

    https://blog.csdn.net/mike8825/article/details/51986405 https://www.cnblogs.com/scl1314/p/7534894.ht ...

  4. input type file上传文件之后清空内容。

    上次写过如何上传文件,上传成功之后,会出现一些问题. 当我打开上传的文件,但是没有点击上传,然后关闭弹窗,接着继续上传刚才的那个文件.为了满足产品组的要求,我们一般都会把样式进行一定的覆盖. 但这就会 ...

  5. java常见设计模式简要总结

    设计模式六大原则 1.开放封闭原则:对扩展开放,对修改封闭,意即程序拓展时不要动原有的代码 2.LSP原则:任何基类可以出现的地方,子类一定可以出现 3.依赖倒置原则:使用接口,依赖于抽象而不是具体 ...

  6. js汉字转拼音首字母

    js汉字转拼音首字母 2018-04-09 阅读 1018 收藏 1 原链:segmentfault.com 分享到:   前端必备图书<JavaScript设计模式与开发实践> > ...

  7. 修复Kaos的中文显示

    前段时间为了尝鲜KDE5,于是安装了Kaos 2015.2,默认的kde5桌面,速度也不错,软件更新很及时,计划淘汰掉chakra算了,一直中文在终端下显示为乱码,经网上搜索整理记录如下: (1)使用 ...

  8. Linux Shell 文本处理工具集锦【转】

    转自:http://www.cnblogs.com/me115/p/3427319.html 内容目录: find 文件查找 grep 文本搜索 xargs 命令行参数转换 sort 排序 uniq ...

  9. 学习总结——JMeter做WebService接口功能测试

    用JMeter作WebService接口功能测试(可以借助SoapUI来完成) SoapUI里面的操作: Wsdl文件或链接导入或添加到SoapUI打开待测请求:运行请求:取URL  SOAPActi ...

  10. nodejs后台启动

    可避免关闭窗口,程序就关闭,可在后台运行 安装forever包,一般用于服务器,调试环境可不安装 npm install forever -g 启动方式如图: 查询后台运行哪些程序 forever l ...