1. //Long是需要比较精度的,所以要用longValue
    if(project.getFriendId().longValue() != friendId.longValue()) {
  2. return this.parseReturnMap(false, null, "项目的客户id与合同客户id不一致!");
  3. }
  4. //注意判断非空 比较结果为 int 值
    if(project.getProjectPrice() == null || project.getProjectPrice().compareTo((BigDecimal) conInfo.get("SOAMOUNT")) != 0) {
  5. return this.parseReturnMap(false, null, "项目的总金额与合同总金额不一致!");
  6. }

BigDecimal类型(+ - * /)所用的属性

11.10 BigDecimal类

对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作。BigDecimal类的常用方法如表11-15所示。

  1. public class PreciseCompute {
  2. //默认除法运算精度
  3. private static final int DEF_DIV_SCALE = 10;
  4.  
  5. /**
  6. * 提供精确的加法运算。
  7. * @param v1 被加数
  8. * @param v2 加数
  9. * @return 两个参数的和
  10. */
  11.  
  12. public static double add(double v1, double v2) {
  13. BigDecimal b1 = new BigDecimal(Double.toString(v1));
  14. BigDecimal b2 = new BigDecimal(Double.toString(v2));
  15. return b1.add(b2).doubleValue();
  16. }
  17.  
  18. /**
  19. * 提供精确的减法运算。
  20. * @param v1 被减数
  21. * @param v2 减数
  22. * @return 两个参数的差
  23. */
  24.  
  25. public static double sub(double v1, double v2) {
  26. BigDecimal b1 = new BigDecimal(Double.toString(v1));
  27. BigDecimal b2 = new BigDecimal(Double.toString(v2));
  28. return b1.subtract(b2).doubleValue();
  29. }
  30.  
  31. /**
  32. * 提供精确的乘法运算。
  33. * @param v1 被乘数
  34. * @param v2 乘数
  35. * @return 两个参数的积
  36. */
  37. public static double mul(double v1, double v2) {
  38. BigDecimal b1 = new BigDecimal(Double.toString(v1));
  39. BigDecimal b2 = new BigDecimal(Double.toString(v2));
  40. return b1.multiply(b2).doubleValue();
  41. }
  42.  
  43. /**
  44. * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
  45. * 小数点以后10位,以后的数字四舍五入。
  46. * @param v1 被除数
  47. * @param v2 除数
  48. * @return 两个参数的商
  49. */
  50.  
  51. public static double div(double v1, double v2) {
  52. return div(v1, v2, DEF_DIV_SCALE);
  53. }
  54.  
  55. /**
  56. * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
  57. * 定精度,以后的数字四舍五入。
  58. * @param v1 被除数
  59. * @param v2 除数
  60. * @param scale 表示表示需要精确到小数点以后几位。
  61. * @return 两个参数的商
  62. */
  63. public static double div(double v1, double v2, int scale) {
  64. if (scale < 0) {
  65. throw new IllegalArgumentException(
  66. "The scale must be a positive integer or zero");
  67. }
  68. BigDecimal b1 = new BigDecimal(Double.toString(v1));
  69. BigDecimal b2 = new BigDecimal(Double.toString(v2));
  70. return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
  71. }
  72.  
  73. /**
  74. * 提供精确的小数位四舍五入处理。
  75. * @param v 需要四舍五入的数字
  76. * @param scale 小数点后保留几位
  77. * @return 四舍五入后的结果
  78. */
  79. public static double round(double v, int scale) {
  80. if (scale < 0) {
  81. throw new IllegalArgumentException(
  82. "The scale must be a positive integer or zero");
  83. }
  84. BigDecimal b = new BigDecimal(Double.toString(v));
  85. BigDecimal ne = new BigDecimal("1");
  86. return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
  87. }
  88. }

表11-15 BigDecimal类的常用方法

序号

方    法

类型

描    述

1

public BigDecimal(double val)

构造

将double表示形式转换

为BigDecimal

2

public BigDecimal(int val)

构造

将int表示形式转换为

BigDecimal

3

public BigDecimal(String val)

构造

将字符串表示

形式转换为BigDecimal

4

public BigDecimal add(BigDecimal augend)

普通

加法

5

public BigDecimal subtract(BigDecimal
subtrahend)

普通

减法

6

public BigDecimal multiply(BigDecimal
multiplicand)

普通

乘法

7

public BigDecimal divide(BigDecimal
divisor)

普通

除法

范例:进行四舍五入的四则运算

    1. package org.lxh.demo11.numberdemo;
    2. import java.math.BigDecimal;
    3. class MyMath {
    4. public static double add(double d1, double d2)
      {        // 进行加法运算
    5. BigDecimal b1 = new BigDecimal(d1);
    6. BigDecimal b2 = new BigDecimal(d2);
    7. return b1.add(b2).doubleValue();
    8. }
    9. public static double sub(double d1, double d2)
      {        // 进行减法运算
    10. BigDecimal b1 = new BigDecimal(d1);
    11. BigDecimal b2 = new BigDecimal(d2);
    12. return b1.subtract(b2).doubleValue();
    13. }
    14. public static double mul(double d1, double d2)
      {        // 进行乘法运算
    15. BigDecimal b1 = new BigDecimal(d1);
    16. BigDecimal b2 = new BigDecimal(d2);
    17. return b1.multiply(b2).doubleValue();
    18. }
    19. public static double div(double d1,
      double d2,int len) {// 进行除法运算
    20. BigDecimal b1 = new BigDecimal(d1);
    21. BigDecimal b2 = new BigDecimal(d2);
    22. return b1.divide(b2,len,BigDecimal.
      ROUND_HALF_UP).doubleValue();
    23. }
    24. public static double round(double d,
      int len) {     // 进行四舍五入
    25. 操作
    26. BigDecimal b1 = new BigDecimal(d);
    27. BigDecimal b2 = new BigDecimal();
    28. // 任何一个数字除以1都是原数字
    29. // ROUND_HALF_UP是BigDecimal的一个常量,
      表示进行四舍五入的操作
    30. return b1.divide(b2, len,BigDecimal.
      ROUND_HALF_UP).doubleValue();
    31. }
    32. }
    33. public class BigDecimalDemo01 {
    34. public static void main(String[] args) {
    35. System.out.println("加法运算:" +
      MyMath.round(MyMath.add(10.345,
    36. 3.333), ));
    37. System.out.println("乘法运算:" +
      MyMath.round(MyMath.mul(10.345,
    38. 3.333), ));
    39. System.out.println("除法运算:" +
      MyMath.div(10.345, 3.333, ));
    40. System.out.println("减法运算:" +
      MyMath.round(MyMath.sub(10.345,
    41. 3.333), ));
    42. }
    43. }

BigDecimal类型、Long类型判断值是否相等,以及BigDecimal加减乘除的更多相关文章

  1. Struts2 用 s:if test 判断String类型的对象属性值和单字符是否相等的问题

    Struts2 用 s:if test 判断String类型的对象属性值和单字符是否相等的问题   首先,这里所指的单字符形如:Y,男. 有两种做法: a. <s:if test='news.s ...

  2. 6.Swift协议|扩展|访问权限|异常调试|类型转换|运算函数|ARC|类类型初试化器|值类型初始化器

    1. 协议(Protocol):与OC之间唯一不同的是Swift中的协议不管是属性还时方法全部是必须实现的 /** protocol*/ protocol FullNamed { /** 计算属性申明 ...

  3. CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段

    编程语言的基元类型   某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们. System.Int32 a = new System.Int32();  // a = 0 a = 1 ...

  4. Long,String类型的两个值进行比较,注意点!!!

    一: . Long 类型指的是 java.util.Lang 对象,而不是基本类型 long (注意大小写)Java中如果使用 == 双等于比较对象,等于比较的是两个对象的内存地址,也就是比较两个对象 ...

  5. 使用interface与类型诊断机制判断一个类型是否实现了某个方法

    Golang中的interface通常用来定义接口,在接口里提供一些方法,其他类型可以实现(implement)这些方法,通过将接口指针指向不同的类型实例实现多态(polymorphism),这是in ...

  6. java中如何使用BigDecimal使得Double类型保留两位有效数字

    一.场景:从数据表中读出Decimal类型的数据直接塞给Double类型的对象时,并不会有什么异常. 如果要再此基础上计算,就会发生异常. 比如:读出数据为0.0092,将其乘以100,则变成了0.9 ...

  7. php中函数 isset(), empty(), is_null() 的区别,boolean类型和string类型的false判断

    php中函数 isset(), empty(), is_null() 的区别,boolean类型和string类型的false判断 实际需求:把sphinx返回的结果放到ssdb缓存里,要考虑到sph ...

  8. Go part 7 反射,反射类型对象,反射值对象

    反射 反射是指在程序运行期间对程序本身进行访问和修改的能力,(程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分,在运行程序时,程序无法获取自身的信息) 支持反射的语言可以在程序编 ...

  9. day06可变与不可变类型,if判断,运算符

    1:可变不可变类型 2.什么是条件?什么可以当做条件?为何要要用条件? 显式布尔值:True.False 隐式布尔值:所有数据类型,其中0.None.空为假 3:逻辑运算符:用来 # not. and ...

随机推荐

  1. vue 过渡的-css-类名

    会有6个css类名在leave/enter过渡中切换 1,v-enter:定义进入过渡的开始状态,在元素被插入时生效,在下一帧中移除 2,v-enter-active:定义过渡的状态.在元素整个过渡过 ...

  2. linux内核的oops

    什么是Oops?从语言学的角度说,Oops应该是一个拟声词.当出了点小事故,或者做了比较尴尬的事之后,你可以说"Oops",翻译成中国话就叫做“哎呦”.“哎呦,对不起,对不起,我真 ...

  3. AD使用技巧

    1. 效果显示 3 显示3D效果,2显示2D效果. 2.  阻焊塞孔 双击过孔显示属性  solder Mask Expansions Force complete tenting on top Fo ...

  4. phpexcel图形图表(一)入门

    PHPExcel - Excel的PHP处理引擎 PHPExcel 提供了一系列的 PHP语言 类,让你可以轻松地读写操作以下格式的文件:.xls/.xlsx/.csv/.ods/Gnumeric/P ...

  5. EOJ Problem #3249 状态压缩+循环周期+反向递推

    限量供应 Time limit per test: 4.0 seconds Time limit all tests: 4.0 seconds Memory limit: 256 megabytes ...

  6. Android Notification使用方法

    1.http://www.cnblogs.com/plokmju/p/android_Notification.html 2.http://blog.csdn.net/vipzjyno1/articl ...

  7. git分支管理与冲突解决(转载)

    Git 分支管理和冲突解决 原文:http://www.cnblogs.com/mengdd/p/3585038.html 创建分支 git branch 没有参数,显示本地版本库中所有的本地分支名称 ...

  8. CentOS6.X 升级内核至 3.10

    1.1 查看当前版本 [root@localhost ~]# uname -r -.el6.x86_64 1.2 导入public key [root@localhost ~]# rpm --impo ...

  9. Android初体验-D3

    1. UI界面布局. (即可用XML控制布局也可采用Java代码布局,不过在实际应用中是两者混合控制UI界面,为什么呢,因为XML适用于固定的不易改变的组件布局,Java程序控制常变的组件...其控制 ...

  10. SharpZIP Lib

    Home:http://www.icsharpcode.net/opensource/sharpziplib/   转至:https://github.com/leowangzi/DanielLib/ ...