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. event对象的兼容性

    最近在调试项目的时候,发现IE和Chrome都显示正常,就是FireFox异常,F12查看控制台,发现报错:window.event is undefined.检查代码中定义的事件方法中获取事件对象直 ...

  2. [HEOI2016/TJOI2016][bzoj4554] 游戏 [建图+最大流]

    题面 传送门 思路 看到棋盘摆放和棋子冲突,再加上这么小的数据范围,你能想到什么? 网络流棋盘模型啊! 就是 把源点连到每一行,每一列连到汇点,再在中间...... 等等,这道题每行不一定全部冲突?? ...

  3. BZOJ 4460 [Jsoi2013]广告计划 ——Bitset 后缀自动机

    发现n比较小,直接枚举答案,然后发现连续的一段是确定的,然后我们只需要判断每个位置是否有这个连续的一段就好了 发现起点不同,最后的位置可能会有差距,所以DP一下就好了 然后用0表示未折返,1表示从最下 ...

  4. xml读取 避开并发(xml的一些操作)

    很多地方读取文件可能会出现并发现象 处理: 使用FileMode.Open, FileAccess.Read, FileShare.ReadWrite 避开并发 public static List& ...

  5. python常用内建函数

    1.input 读取控制台的输入,输出的是字符串 2.enumerate 遍历数组的时候,能够将index 和item同时返回,返回的每一项包含index,item 3.isinstance(obje ...

  6. 'NoneType' object has no attribute '__getitem__'

    报错 'NoneType' object has no attribute '__getitem__' 你 result 返回的是 None ,所以 result [0] 取不了值

  7. 分配问题(cogs 740)

    «问题描述: 有n件工作要分配给n个人做.第i 个人做第j 件工作产生的效益为c[i][j]  .试设计一个将n件工作分配给n个人做的分配方案,使产生的总效益最大. «编程任务: 对于给定的n件工作和 ...

  8. 向量内积(bzoj 3243)

    Description 两个d 维向量A=[a1,a2,...,ad]与B=[b1,b2,...,bd]的内积为其相对应维度的权值的乘积和,即: 现有 n 个d 维向量x1,...,xn ,小喵喵想知 ...

  9. SPOJ QTREE4 SPOJ Query on a tree IV

    You are given a tree (an acyclic undirected connected graph) with N nodes, and nodes numbered 1,2,3. ...

  10. 洛谷 P1262 间谍网络==Codevs 4093 EZ的间谍网络

    4093 EZ的间谍网络 时间限制: 10 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B ...