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 ...
随机推荐
- pthread_cleanup_push和pthread_cleanup_pop清除函数是否执行的说明
示例1: #include <stdio.h> #include <pthread.h> void* clean(void* arg) { printf("clean ...
- java - day12 - InteraceTest
接口的实现.继承等 package test.interfacedemo; import test.interfacedemo.Inter; public class InterfaceDemo { ...
- iOS10 获取系统通讯录新方法
#import <ContactsUI/ContactsUI.h> 遵循代理 CNContactPickerDelegate 调用通讯录 如果在iOS10的机器上调用以前的ABPeople ...
- VS中去除SrouceControl的信息
如果在不连接TFS的情况下,编辑一个已经source control的solution,总是会有烦人的提示信息.如果你确定不再需要source control,可以这么干. Here is how t ...
- Java并发编程(十一)实例封闭
本节主题:如果一个类是线程不安全的,但是又要在多线程程序中安全地使用,你该怎么办? 大体有两种思路: 第一种:确保该对象是能由单个线程访问,也就是这个对象是被封闭在线程中的: 第二种:通过锁来对该对象 ...
- 程序的记事本--log4net
你是否在遇到程序执行问题时常常百度?你是否在遇到执行错误时常常去询问别人?假设有那么是时候改变啦,对于一个Developer来说那是不专业的表现,专业的Developer都会首先查看程序的执行日志.先 ...
- jQuery 数据操作函数
函数 描述 .clearQueue() 从队列中删除所有未运行的项目. .data() 存储与匹配元素相关的任意数据. jQuery.data() 存储与指定元素相关的任意数据. .dequeue() ...
- 百度-设置-搜索设置-每页显示50条-保存设置-打印alert信息-accept确定
一.场景: 代码: #coding:utf-8from selenium import webdriverfrom selenium.webdriver.common.action_chains im ...
- 2213 Problem J
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm& ...
- [Unity3D]Unity3D游戏开发之伤害数值显示
大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei.众所周知,在RPG游戏策划中最为重要的一个环节是数值策划.数值策划是一个关于游戏平衡方面的概念 ...