Java 中计算注意!!!
* 使用BigDecimal需要注意的事项:
*
1
、两个BigDecimal值不能使用“ +, -, *, / ” 进行加减乘除,要使用“ add, substract, multiply, divide ”;
*
2
、两个BigDecimal值比较使用compareTo方法, 比较结果有-
1
,
0
,
1
, 分别表示小于, 等于, 大于; 对于
0
, 可以使用BigDecimal.ZERO表示;
*
3
、提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入;
*
4
、因
double
有效位数为
16
位这就会出现存储小数位数不够的情况,这种情况下就会出现误差,解决方法就是使用BigDecimal,它的有
效长度足够长可存储 小数位数因此可代替
double
来进行加减乘除, 金额必须是完全精确的计算, 故不能使用
double
或者
float
, 而
应该采用java.math.BigDecimal.
*
5
、mysql数据库设计
BigDecimal在进行入库时, 数据库选择decimal类型, 长度可以自定义, 如
18
; 小数点我们项目中用的是
2
, 保留
2
位小数. 此外还要注意的就是默认值,
一定写成
0.00
, 不要用默认的NULL, 否则在进行加减排序等操作时, 会带来转换的麻烦!
如 :`balance` decimal(
18
,
2
) DEFAULT
'0.00'
COMMENT
'账户余额'
,
*/
1、浮点型变量(float和double)
带小数的变量在Java中称为浮点型,Java的浮点型有两种:float和double。
float类型代表单精度浮点数,占4个字节、32位。double类型代表双精度浮点数,占8个字节、64位。
Java语言的浮点数有两种表示形式:
1)十进制数形式:例如3.14、314.0、0.314。浮点数必须包含一个小数点,否则会被当成int类型处理。
2)科学计数法形式:例如3.14e2(即3.14*102),31.4e-2(即314*10-2)。
必须指出的是,只有浮点型的数值才可以使用科学计数法形式表示。例如31400是一个int类型的值,但314E2则是浮点类型的值。
Java语言的浮点类型默认是double类型,如果希望Java把一个浮点类型值当成float类型处理,应该在这个浮点类型值的后面紧跟F或f。例如3.14代表一个double类型的值,占64位的内存空间;3.14F才表示一个float类型的值,占32位的内存空间。当然也可以在一个浮点数后添加D或d后缀,强制指定double类型,但通常没必要。
Java还提供了三个特殊的浮点数值:正无穷大、负无穷大和非数,用于表示溢出和出错。例如,使用一个正数除以0将得到正无穷大,使用负数除以0将得到负无穷大,0.0除以0.0或对一个负数开方将得到一个非数。正无穷大通过Double或Float类的POSITIVE_INFINITY表示;负无穷大通过Double或Float类的NEGATIVE_INFINITY表示,非数通过Double或Float类的NaN表示。
必须指出的是,所有的正无穷大数值都是相等的,所有的负无穷大数值都是相等的;而NaN不与任何数值相等,甚至和NaN都不相等。
注:只有浮点数除以0才可以得到正无穷大或负无穷大,如果一个整数除以0则会抛出一个异常:ArithmeticException:/by zero(除以0异常)。
2、BigDecimal
由于Java浮点数使用二进制数据的科学计数法表示,所以可能不能精确表示一个浮点数。如果需要进行不产生误差的精确数字计算,需要使用BigDecimal类。
先看如下程序:
1)浮点数的比较一
float f = 0.1f;
double d = 1.0/10;
//结果为false
System.out.println(f==d);
2)浮点数的比较二
float d1 = 423432423f;
float d2 = d1+1;
if(d1==d2){
//输出结果为 d1==d2
System.out.println("d1==d2");
}else{
上面程序运行结果表明,Java的浮点数会发生精度丢失,尤其在算术运算时更易发生这种情况,所以,不要使用浮点数进行运算和比较!
创建BigDecimal对象的构造器有很多,建议使用BigDecimal(String val)这个构造器,因为这个结果是可以预知的,例如,new BigDecimal("0.2")将创建一个BigDecimal,它正好等于预期的0.2,因此通常建议优先使用基于String的构造器。
如果必须使用double浮点数作为BigDecimal构造器的参数时,不要直接将该double浮点数作为构造器参数创建BigDecimal对象,而是通过BigDecimal.valueOf(double value)静态方法来创建BigDecimal对象。
总结:
老鸟建议:浮点类型float,double的数据不适合在不容许舍入误差的金融计算领域。如果需要进行不产生舍入误差的精确数字计算,需要使用BigDecimal类。
菜鸟雷区:不要使用浮点数进行比较!很多新人甚至很多理论不扎实的有工作经验的程序员也会犯这个错误!需要比较请使用BigDecimal类。
觉得内容还不错的话,给我点个“在看”呗
Java 中计算注意!!!的更多相关文章
- Java中计算对象的大小
一.计算对象大小的方法 Java中如何计算对象的大小呢,找到了4种方法: 1.java.lang.instrument.Instrumentation的getObjectSize方法: 2.BTrac ...
- JAVA中计算两个日期时间的差值竟然也有这么多门道
上半年春招的时候,作为面试官,对于面试表现的不错的同学会要求其写一小段代码看看.题目很简单: 给定一个日期,然后计算下距离今天相差的天数. 本以为这么个问题就是用来活跃面试氛围的,但是结果却让人大跌眼 ...
- java中计算一段时间内白天的时间和夜晚的时间
之前,采用拼接字符串的形式,不断地在Date类型和Long类型之间转换,实在是太过于麻烦,后来采取了这种思路:假设我们将22:00 ~ 10:00 视为夜间时间,则我们先计算出10:00 相对于当天的 ...
- java中计算两个日期之间天数的程序设计。
//用java编写出一个以下方法计算两个日期之间天数的程序设计. import java.util.regex.Matcher; import java.util.regex.Pattern; pub ...
- java中计算两个时间差
java计算时间差及比较时间大小 比如:现在是2004-03-26 13:31:40 过去是:2004-01-02 11:30:24 我现在要获得两个日期差,差的形式为:XX天XX小时XX分XX秒 方 ...
- 关于Java中计算日期差值不准确问题
1.字符串日期相减 如:2016-4-1,必须先将此字符串转成Date对象,并且, 格式必须为:yyyy—MM—dd HH:mm:ss. 如果不转就直接计算(2016-4-1)两个这样的日期,则误差 ...
- JAVA中计算两个时间相差多少 天,时,分,秒
1: import java.util.Date; 2: 3: public class ShowTimeInterval{ 4: public void ShowTimeInterval(Date ...
- java中计算时间差
Calendar cale = null; SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" ...
- Java中Double类型计算问题
public class Test{ public static void main(String args[]){ System.out.println(0.05+0.01); ...
随机推荐
- 以Docker容器的形式运行GVM-11
OpenVAS(Open Vulnerability Assessment System)是在nessus基础上发展起来的一个开源的漏洞扫描程序,其核心部件是一套漏洞测试程序,可以检测远程系统和应用程 ...
- ansible批量修改服务器密码
看了一下网上代码大多数是ansible-playbook实现的,需要写一个脚本,或者手动传递变量进去. 以前用python tcp模块写过客户端主动上报修改密码脚本 今天写一个ansible主控客户端 ...
- windows mysql数据存储路径更改
背景:之前服务器磁盘很小,随着数据量的不断增加,磁盘不够,所以新申请了更大的磁盘,然后需要将旧路径下的数据迁移到新磁盘上. 1.任务管理器-打开服务,找到mysql的启动项,停止服务,属性查看可执行文 ...
- 轩辕展览-为什么要做VR虚拟展厅设计?
沉浸感,有趣和互动体验VR虚拟展厅设计给客户带来高度的沉浸感和互动体验,给客户一种真实的感觉,让客户更愿意参与,使商家的宣传更加客观. 展示方式多样化 ,增加宣传优势在展示产品或企业时,VR全景可达到 ...
- bool 类型位逻辑运算符(| & ^)与条件逻辑运算符(|| &&)的区别
bool 类型的运算符 & ^| && || ! 运算符&&和|| 是短路的,这意味着如果左侧表达式的值足以确定结果,则它们将不会评估其右侧表达式. ...
- vue项目npm run dev 报错error in ./src/main.js Module build failed: ReferenceError: Unknown plugin "transform-vue-jsx" specified in......
问题: vue项目npm run dev运行时报错,如下图: 原因: 缺少组件 解决办法: 安装相应的组件: npm install babel-plugin-transform-vue-jsx ...
- consul-常用命令
1.consul 是B/C架构.服务端和客户端包是一样的.差别在于启动时候的参数. --客户端 ./consul agent -join=172.29.2.65:8301 -bind=172.29.3 ...
- TensorFlow入门示例教程
本部分的代码目前都是基于GitHub大佬非常详细的TensorFlow的教程上,首先给出链接: https://github.com/aymericdamien/TensorFlow-Examples ...
- 矩池云 | 神经网络图像分割:气胸X光片识别案例
在上一次肺炎X光片的预测中,我们通过神经网络来识别患者胸部的X光片,用于检测患者是否患有肺炎.这是一个典型的神经网络图像分类在医学领域中的运用. 另外,神经网络的图像分割在医学领域中也有着很重要的用作 ...
- 浅识 npm 与 cnpm
npm是什么? Node Package(包) Manager(管理器) 的简称. 在 GitHub 还没有兴起的年代,前端是通过网址来共享代码.比如你想使用 jQuery,那么你点击 jQuery ...