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 ...
随机推荐
- iOS中解析Bonjour服务(转)
服务器端Bonjour服务发布成功之后,客户端可以通过NSNetService解析服务,解析成功后,可以获得通讯的数据细节,如:IP地址.端口等信息. 首先需要实例化NSNetService对象代码如 ...
- C# 子类实例化过程
刚研究了一下C#子类实例化的过程. 首先我遇到了如下一个问题: 有类A,里面写了一个有参的构造函数,并没有提供默认的无参构造函数.现在类B继承了类A,没有写任何的构造函数. 这时如果想实例化类B就会产 ...
- ES6 学习笔记 (1)
笔记来源:廖雪峰老师的javascript全栈教程 ES6:JavaScript的标准,ECMAScript在不断发展,最新版ECMAScript 6标准(简称ES6)已经在2015年6月正式发布了, ...
- 这是一篇markdown测试博客
欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接 ...
- Mysql中查看每个IP的连接数
) as ip , count(*) from information_schema.processlist group by ip;
- hdu 2586(最近公共祖先LCA)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 思路:在求解最近公共祖先的问题上,用到的是Tarjan的思想,从根结点开始形成一棵深搜树,非常好 ...
- day7笔记
一.上节回顾 字典:dic = {'name':'alex'} 1,增 dic['k'] = 'v' 有键值对,则覆盖 setdefault 有键值对,不添加 dic.setdefault('k1', ...
- poj 3590(dp 置换)
题目的意思是对于序列1,2,...,n.要你给出一种字典序最小的置换使得经过X次后变成最初状态,且要求最小的X最大. 通过理解置换的性质,问题可以等价于求x1,x2,..,xn 使得x1+x2+... ...
- ZOJ1311(Network)
题目链接:传送门 题目大意:给你一副无向图,求有多少个割点 题目思路:tarjan算法(此题读入是字符串读入,需注意) #include <iostream> #include <c ...
- 《从零开始学Swift》学习笔记(Day 9)——离开表达式你试试!
原创文章,欢迎转载.转载请注明:关东升的博客 表达式啊是很重要地. 在Swift中,表达式有3种形式. 不指定数据类型 var a1 = 10 指定数据类型 var a1:Int = 10 使用分号 ...