BigDecimal类型、Long类型判断值是否相等,以及BigDecimal加减乘除

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

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

11.10 BigDecimal类

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

public class PreciseCompute {
//默认除法运算精度
private static final int DEF_DIV_SCALE = 10;

/**
* 提供精确的加法运算。
* @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 ne = new BigDecimal("1");
   return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
}

表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(1);
    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), 1));
    37. System.out.println("乘法运算:" +
      MyMath.round(MyMath.mul(10.345,
    38. 3.333), 3));
    39. System.out.println("除法运算:" +
      MyMath.div(10.345, 3.333, 3));
    40. System.out.println("减法运算:" +
      MyMath.round(MyMath.sub(10.345,
    41. 3.333), 3));
    42. }
    43. }
时间: 2024-10-30 23:09:41

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

201507010852_《Javascript权威指南(第六版)——判断值类型的type函数 、鸭式辩型》(P210-217)

一. 类的扩充 1. 只要扩充原型类,就能动态更新到实例.例如:xxx.prototype.do = function() {//...}; 2. 不建议采用污染JavaScript的方法,如:Object.prototype.methods = function() {//...};   采用<权威指南>9.8.1中的方法添加属性,如:Object.defineProperty(//...); 3. 二. 类和类型 1. isPrototypeOf(); 2. 三. constructor属

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

编程语言的基元类型 某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们. System.Int32 a = new System.Int32();  // a = 0 a = 1; 等价于: int a = 1; 这种语法不仅增强了代码的可读性,其生成的IL代码与使用System.Int32时生成的IL代码是完全一致的. 编译器直接支持的数据类型称为基元类型(primitive type).基元类型直接映射到Framework类库(FCL)中存在的类型.如C#中,int直接映射

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

1. 协议(Protocol):与OC之间唯一不同的是Swift中的协议不管是属性还时方法全部是必须实现的 /** protocol*/ protocol FullNamed { /** 计算属性申明,只读的计算属性*/ var fullName:String { get } } /** 实现协议*/ struct Person:FullNamed { /** 实现协议  可以把计算属性实现为存储属性,更改其本身的性质*/ var fullName: String = "abc" }

第5章 基元类型、引用类型和值类型

5.1编程语言的基元类型 编译器(Compiler)直接支持的数据类型称为基元类型(primitive type). 我希望编译器根本不要提供基元类型名称,强制开发人员使用FCL(Framework类库)类型名称: 许多开发人员都困惑于到底应该使用string还是String.由于C#的string直接映射到System.String,所以两者是没有区别的.int始终映射到System.Int32,所以不管在什么操作系统上运行,代表的都是32位整数. 5.2引用类型和值类型 虽然FCL中大多数类

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

一.场景:从数据表中读出Decimal类型的数据直接塞给Double类型的对象时,并不会有什么异常. 如果要再此基础上计算,就会发生异常. 比如:读出数据为0.0092,将其乘以100,则变成了0.919999999999999... 二.原因: java mysql 数据类型对照如下: 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述             VARCHAR L+N VARCHAR java.lang.String 12   CHAR N CHAR

Swift编程语言学习1.5——类型别名、布尔值、元组

类型别名 类型别名(type aliases)就是给现有类型定义另一个名字.你可以使用typealias关键字来定义类型别名. 当你想要给现有类型起一个更有意义的名字时,类型别名非常有用.假设你正在处理特定长度的外部资源的数据: typealias AudioSample = UInt16 定义了一个类型别名之后,你可以在任何使用原始名的地方使用别名: var maxAmplitudeFound = AudioSample.min // maxAmplitudeFound 现在是 0 本例中,A

5.基元类型、引用类型和值类型

5.1 基远类型 编译器直接支持的数据类型称为基远类型(primitive type). 以下4行到吗生成完全相同的IL int a = 0; //最方便的语法 System.Int32 b = 0; //方便的语法 int c = new int(); //不方便的语法 System.Int32 d = new System.Int32(); //最不方便的语法 C#基元类型与对应的FCL类型 C#中的基元类型 FCL类型 是否与CLS兼容 描述 sbyte System.SByte N 有符

CLR VIA C#: 基元类型、 引用类型 和 值类型

一.基元类型 . 引用类型 和 值类型的区别: 1.基元类型(primitive type):编译器直接支持的数据类型: 基元类型 直接映射到 FCL 中存在的类型. C# 小写是基元类型,例如:string ,  大写是FCL类型,例如String,  基元类型直接映射到FCL类型,所以这两者之间没有区别,一模一样,不用纠结使用哪种方式了. 支持 直接使用FCL类型, 不使用基元类型, Float 对应 Single FCL类型: dynamic 对应  System.Object FCL类型

返回枚举值的描述 根据枚举类型返回类型中的所有值、文本及描述

/// <summary> /// 返回枚举值的描述 /// </summary> /// <param name="value">枚举值</param> /// <returns>指定枚举值描述</returns> public static string getEnumDescription(this Enum value) { FieldInfo fi = value.GetType().GetField(v