BigDecimal类型、Long类型判断值是否相等,以及BigDecimal加减乘除
//Long是需要比较精度的,所以要用longValue
if(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 |
普通 |
减法 |
6 |
public BigDecimal multiply(BigDecimal |
普通 |
乘法 |
7 |
public BigDecimal divide(BigDecimal |
普通 |
除法 |
范例:进行四舍五入的四则运算
- package org.lxh.demo11.numberdemo;
- import java.math.BigDecimal;
- class MyMath {
- public static double add(double d1, double d2)
{ // 进行加法运算 - BigDecimal b1 = new BigDecimal(d1);
- BigDecimal b2 = new BigDecimal(d2);
- return b1.add(b2).doubleValue();
- }
- public static double sub(double d1, double d2)
{ // 进行减法运算 - BigDecimal b1 = new BigDecimal(d1);
- BigDecimal b2 = new BigDecimal(d2);
- return b1.subtract(b2).doubleValue();
- }
- public static double mul(double d1, double d2)
{ // 进行乘法运算 - BigDecimal b1 = new BigDecimal(d1);
- BigDecimal b2 = new BigDecimal(d2);
- return b1.multiply(b2).doubleValue();
- }
- public static double div(double d1,
double d2,int len) {// 进行除法运算 - BigDecimal b1 = new BigDecimal(d1);
- BigDecimal b2 = new BigDecimal(d2);
- return b1.divide(b2,len,BigDecimal.
ROUND_HALF_UP).doubleValue(); - }
- public static double round(double d,
int len) { // 进行四舍五入 - 操作
- BigDecimal b1 = new BigDecimal(d);
- BigDecimal b2 = new BigDecimal();
- // 任何一个数字除以1都是原数字
- // ROUND_HALF_UP是BigDecimal的一个常量,
表示进行四舍五入的操作 - return b1.divide(b2, len,BigDecimal.
ROUND_HALF_UP).doubleValue(); - }
- }
- public class BigDecimalDemo01 {
- public static void main(String[] args) {
- System.out.println("加法运算:" +
MyMath.round(MyMath.add(10.345, - 3.333), ));
- System.out.println("乘法运算:" +
MyMath.round(MyMath.mul(10.345, - 3.333), ));
- System.out.println("除法运算:" +
MyMath.div(10.345, 3.333, )); - System.out.println("减法运算:" +
MyMath.round(MyMath.sub(10.345, - 3.333), ));
- }
- }
BigDecimal类型、Long类型判断值是否相等,以及BigDecimal加减乘除的更多相关文章
- Struts2 用 s:if test 判断String类型的对象属性值和单字符是否相等的问题
Struts2 用 s:if test 判断String类型的对象属性值和单字符是否相等的问题 首先,这里所指的单字符形如:Y,男. 有两种做法: a. <s:if test='news.s ...
- 6.Swift协议|扩展|访问权限|异常调试|类型转换|运算函数|ARC|类类型初试化器|值类型初始化器
1. 协议(Protocol):与OC之间唯一不同的是Swift中的协议不管是属性还时方法全部是必须实现的 /** protocol*/ protocol FullNamed { /** 计算属性申明 ...
- CLR via C#深解笔记三 - 基元类型、引用类型和值类型 | 类型和成员基础 | 常量和字段
编程语言的基元类型 某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们. System.Int32 a = new System.Int32(); // a = 0 a = 1 ...
- Long,String类型的两个值进行比较,注意点!!!
一: . Long 类型指的是 java.util.Lang 对象,而不是基本类型 long (注意大小写)Java中如果使用 == 双等于比较对象,等于比较的是两个对象的内存地址,也就是比较两个对象 ...
- 使用interface与类型诊断机制判断一个类型是否实现了某个方法
Golang中的interface通常用来定义接口,在接口里提供一些方法,其他类型可以实现(implement)这些方法,通过将接口指针指向不同的类型实例实现多态(polymorphism),这是in ...
- java中如何使用BigDecimal使得Double类型保留两位有效数字
一.场景:从数据表中读出Decimal类型的数据直接塞给Double类型的对象时,并不会有什么异常. 如果要再此基础上计算,就会发生异常. 比如:读出数据为0.0092,将其乘以100,则变成了0.9 ...
- php中函数 isset(), empty(), is_null() 的区别,boolean类型和string类型的false判断
php中函数 isset(), empty(), is_null() 的区别,boolean类型和string类型的false判断 实际需求:把sphinx返回的结果放到ssdb缓存里,要考虑到sph ...
- Go part 7 反射,反射类型对象,反射值对象
反射 反射是指在程序运行期间对程序本身进行访问和修改的能力,(程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分,在运行程序时,程序无法获取自身的信息) 支持反射的语言可以在程序编 ...
- day06可变与不可变类型,if判断,运算符
1:可变不可变类型 2.什么是条件?什么可以当做条件?为何要要用条件? 显式布尔值:True.False 隐式布尔值:所有数据类型,其中0.None.空为假 3:逻辑运算符:用来 # not. and ...
随机推荐
- 用VMware 8安装Ubuntu 12.04具体过程(图解)
图解演示环境版本号: 本机系统: WIN7 虚拟机:VMware Workstation 8 (英文版) 安装目标:Ubuntu Desktop 12.04 LTS (请点击这里)先下载好iso镜像 ...
- javascript消息框
JavaScript有三种消息框: 警告框:alert() alert("我是警告框!!") 确认框:confirm() function show_confirm() { var ...
- PIL之基础应用
>>> from PIL import Image >>> #读取图像文件 ... >>> gal=Image.open('/Users/simi ...
- jquery通过val()取不到textarea中的值
小编定义了一个textarea控件,却无法根据id取到textarea对象并赋值. 经过实验,得出了原因.代码如下: <!DOCTYPE html> <html> <he ...
- Spring MVC复选框
以下示例显示如何在使用Spring Web MVC框架的表单中使用复选框(Checkbox).首先使用Eclipse IDE来创建一个WEB工程,并按照以下步骤使用Spring Web Framewo ...
- iOS QQ的AppID转换16进制的方法
801312852为QQ的AppID 打开终端 echo 'ibase=10;obase=16;801312852'|bc 红色框内的即为转换后的16进制
- 粗略。。。java设计模式总结。。。studying
设计模式5--DAO(data access object) 1)把本机内存数据保存到指定目录中 2)把本机指定目录中数据读取到内存中 设计模式4--装饰模式 1)加强某个类的功能,并把该类加到加强类 ...
- Android开发:拖拽
google官网的training和API两个地方都提到了拖拽的实现,两种方法不太一样. 方法一 training(https://developer.android.com/training/ges ...
- HDU4027(Can you answer these queries?)
题目链接:传送门 题目大意:有一个长度为n的数组,有m次操作,每次操作输入 v x y,v==0时x~y区间内的数都开平方并且向下取整,v==1时求x~y区间内所有数的和. 题目思路:long lon ...
- 【BZOJ2555】SubString 后缀自动机+LCT
[BZOJ2555]SubString Description 懒得写背景了,给你一个字符串init,要求你支持两个操作 (1):在当前字符串的后面插入一个字符串 (2 ...