1. import java.math.BigDecimal;
  2.  
  3. /**
  4. * 进行BigDecimal对象的加减乘除,四舍五入等运算的工具类
  5. * @author ameyume
  6. *
  7. */
  8. public class Arith {
  9.  
  10. /**
  11. * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精
  12. * 确的浮点数运算,包括加减乘除和四舍五入。
  13. */
  14. //默认除法运算精度
  15. private static final int DEF_DIV_SCALE = ;
  16.  
  17. //这个类不能实例化
  18. private Arith(){
  19. }
  20.  
  21. /**
  22. * 提供精确的加法运算。
  23. * @param v1 被加数
  24. * @param v2 加数
  25. * @return 两个参数的和
  26. */
  27. public static double add(double v1,double v2){
  28. BigDecimal b1 = new BigDecimal(Double.toString(v1));
  29. BigDecimal b2 = new BigDecimal(Double.toString(v2));
  30. return b1.add(b2).doubleValue();
  31. }
  32.  
  33. /**
  34. * 提供精确的减法运算。
  35. * @param v1 被减数
  36. * @param v2 减数
  37. * @return 两个参数的差
  38. */
  39. public static double sub(double v1,double v2){
  40. BigDecimal b1 = new BigDecimal(Double.toString(v1));
  41. BigDecimal b2 = new BigDecimal(Double.toString(v2));
  42. return b1.subtract(b2).doubleValue();
  43. }
  44.  
  45. /**
  46. * 提供精确的乘法运算。
  47. * @param v1 被乘数
  48. * @param v2 乘数
  49. * @return 两个参数的积
  50. */
  51. public static double mul(double v1,double v2){
  52. BigDecimal b1 = new BigDecimal(Double.toString(v1));
  53. BigDecimal b2 = new BigDecimal(Double.toString(v2));
  54. return b1.multiply(b2).doubleValue();
  55. }
  56.  
  57. /**
  58. * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
  59. * 小数点以后10位,以后的数字四舍五入。
  60. * @param v1 被除数
  61. * @param v2 除数
  62. * @return 两个参数的商
  63. */
  64. public static double div(double v1,double v2){
  65. return div(v1,v2,DEF_DIV_SCALE);
  66. }
  67.  
  68. /**
  69. * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
  70. * 定精度,以后的数字四舍五入。
  71. * @param v1 被除数
  72. * @param v2 除数
  73. * @param scale 表示表示需要精确到小数点以后几位。
  74. * @return 两个参数的商
  75. */
  76. public static double div(double v1,double v2,int scale){
  77. if(scale<){
  78. throw new IllegalArgumentException(
  79. "The scale must be a positive integer or zero");
  80. }
  81. BigDecimal b1 = new BigDecimal(Double.toString(v1));
  82. BigDecimal b2 = new BigDecimal(Double.toString(v2));
  83. return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
  84. }
  85.  
  86. /**
  87. * 提供精确的小数位四舍五入处理。
  88. * @param v 需要四舍五入的数字
  89. * @param scale 小数点后保留几位
  90. * @return 四舍五入后的结果
  91. */
  92. public static double round(double v,int scale){
  93. if(scale<){
  94. throw new IllegalArgumentException(
  95. "The scale must be a positive integer or zero");
  96. }
  97. BigDecimal b = new BigDecimal(Double.toString(v));
  98. BigDecimal one = new BigDecimal("");
  99. return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
  100. }
  101.  
  102. /**
  103. * 提供精确的类型转换(Float)
  104. * @param v 需要被转换的数字
  105. * @return 返回转换结果
  106. */
  107. public static float convertsToFloat(double v){
  108. BigDecimal b = new BigDecimal(v);
  109. return b.floatValue();
  110. }
  111.  
  112. /**
  113. * 提供精确的类型转换(Int)不进行四舍五入
  114. * @param v 需要被转换的数字
  115. * @return 返回转换结果
  116. */
  117. public static int convertsToInt(double v){
  118. BigDecimal b = new BigDecimal(v);
  119. return b.intValue();
  120. }
  121.  
  122. /**
  123. * 提供精确的类型转换(Long)
  124. * @param v 需要被转换的数字
  125. * @return 返回转换结果
  126. */
  127. public static long convertsToLong(double v){
  128. BigDecimal b = new BigDecimal(v);
  129. return b.longValue();
  130. }
  131.  
  132. /**
  133. * 返回两个数中大的一个值
  134. * @param v1 需要被对比的第一个数
  135. * @param v2 需要被对比的第二个数
  136. * @return 返回两个数中大的一个值
  137. */
  138. public static double returnMax(double v1,double v2){
  139. BigDecimal b1 = new BigDecimal(v1);
  140. BigDecimal b2 = new BigDecimal(v2);
  141. return b1.max(b2).doubleValue();
  142. }
  143.  
  144. /**
  145. * 返回两个数中小的一个值
  146. * @param v1 需要被对比的第一个数
  147. * @param v2 需要被对比的第二个数
  148. * @return 返回两个数中小的一个值
  149. */
  150. public static double returnMin(double v1,double v2){
  151. BigDecimal b1 = new BigDecimal(v1);
  152. BigDecimal b2 = new BigDecimal(v2);
  153. return b1.min(b2).doubleValue();
  154. }
  155.  
  156. /**
  157. * 精确对比两个数字
  158. * @param v1 需要被对比的第一个数
  159. * @param v2 需要被对比的第二个数
  160. * @return 如果两个数一样则返回0,如果第一个数比第二个数大则返回1,反之返回-1
  161. */
  162. public static int compareTo(double v1,double v2){
  163. BigDecimal b1 = new BigDecimal(v1);
  164. BigDecimal b2 = new BigDecimal(v2);
  165. return b1.compareTo(b2);
  166. }
  167.  
  168. }

BigDecimal的操作工具类的更多相关文章

  1. Code片段 : .properties属性文件操作工具类 & JSON工具类

    摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “贵专” — 泥瓦匠 一.java.util.Properties API & 案例 j ...

  2. [转载]C# FTP操作工具类

    本文转载自<C# Ftp操作工具类>,仅对原文格式进行了整理. 介绍了几种FTP操作的函数,供后期编程时查阅. 参考一: using System; using System.Collec ...

  3. 拼音操作工具类 - PinyinUtil.java

    拼音操作工具类,提供字符串转换成拼音数组.汉字转换成拼音.取汉字的首字母等方法. 源码如下:(点击下载 -PinyinUtil.java.pinyin4j-2.5.0.jar ) import net ...

  4. DataTable操作工具类DataTableHelper

    DataTable操作工具类DataTableHelper. 功能介绍: 将泛型集合填充为数据表 将泛型填充为数据表 将对象集合填充为数据表 将对象填充为数据表 将定IDictionary数据转换为D ...

  5. 【转载】ASP.NET工具类:文件夹目录Directory操作工具类

    在ASP.NET开发网站的过程中,有时候会涉及到文件夹相关操作,如判断文件夹目录是否存在.删除文件夹目录.创建文件.删除文件.复制文件夹等等.这一批有关文件目录的操作可以通过Directory类.Fi ...

  6. Java SE 之 数据库操作工具类(DBUtil)设计

    JDBC创建数据库基本连接 //1.加载驱动程序 Class.forName(driveName); //2.获得数据库连接 Connection connection = DriverManager ...

  7. JavaScript时间操作工具类

    /** * 时间操作工具类 * * @author zwq * */ var TimeFrameUtil = { /** * 格式化日期 * @param date {Date} 日期 * @para ...

  8. java基础37 集合框架工具类Collections和数组操作工具类Arrays

    一.集合框架工具类:Collections 1.1.Collections类的特点 该工具类中所有的方法都是静态的 1.2.Collections类的常用方法 binarySearch(List< ...

  9. 文件操作工具类: 文件/目录的创建、删除、移动、复制、zip压缩与解压.

    FileOperationUtils.java package com.xnl.utils; import java.io.BufferedInputStream; import java.io.Bu ...

随机推荐

  1. Eclipse快捷键 之 代码追踪

    在使用Java编写复杂一些的程序时,你会不会常常对一层层的继承关系和一次次方法的调用感到迷惘呢?幸亏我们有了Eclipse这么好的IDE可以帮我们理清头绪--这就要使用Eclipse强大的代码追踪功能 ...

  2. HBase版本进化史及大版本特性

    HBase 2.0 新特性介绍 2018年4月30日HBase发布了2.0的Release版本.HBase的2.0版本承载了太多的Features,共包含4551个Issues,可以说是迄今最大的一个 ...

  3. python_面向对象,类名称空间,对象名称空间,组合

    创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类有两种属性:静态属性和动态属性 静态属性就是直接在类中定义的变量(字段) 动态属性就是定义在类中的方法 其中类 ...

  4. docker--build base image

    通过dockerfile build一个base image,在上面运行一个c程序 首先 1.创建一个目录. 2.然后创建一个c写的小程序,并且gcc编译好. 3.创建一个Dockerfile FRO ...

  5. 【java】自定义排序

    使用Comparable接口 这里定义了一个类Node,有两个属性,id,age. 排序方法是,先根据id升序排,id一样,age降序排. 里面有一个compareTo方法.返回值有三个 1. < ...

  6. 使用mybatis时,sql查出来的结果映射不进逆向工程生成的该模型

    为了逆向工程生成驼峰效果,我们会在两个单词中间加_,但是在mybatis中,写sql语句时,要加别名,使别名和你逆向工程生成的该数据模型里面的属性名一致,否则查出来的结果映射不进去.

  7. teb教程2

    http://wiki.ros.org/teb_local_planner/Tutorials/Inspect%20optimization%20feedback 检查优化反馈 简介:怎样检查优化的轨 ...

  8. linux - sftp, scp, rz, sz(文件传输命令)

    1. sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具.由于它是基于SSH的,会在传输过程中对用户的密码.数据等敏感信息进行加密,因此可以有效的防止用户信息在传输的过程中被窃 ...

  9. linux配置java环境变量(详细)(转)

    linux配置java环境变量(详细) 一. 解压安装jdk 在shell终端下进入jdk-6u14-linux-i586.bin文件所在目录, 执行命令 ./jdk-6u14-linux-i586. ...

  10. Java中IO流之字符流

    我们有了字节流,为什么还需要字符流? 字符的底层是 字节 + 编码表 = 字符,字符是人能看懂的信息. 字符流在使用的时候,会以字节流为基础,把字节写入缓冲区,在缓冲区内根据编码类型(UTF-8,GB ...