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); ...
随机推荐
- IDEA 端口占用,启动失败,提示Web server failed to start. Port 8080 was already in use.
问题描述: 使用IDEA开发Spring Boot项目,今天启动提示端口占用,导致启动失败!(我昨天也是用的这个端口,可以正常启动) *************************** APPLI ...
- Java中Vo、Po等对象的解释
PO:全称是 persistant object持久对象 最形象的理解就是一个PO就是数据库中的一条记录. 好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象. BO:全称是 busines ...
- nginx 80端口强制转443
server { listen 80; server_name test.com; rewrite ^(.*)$ https://${server_name}$1 permanent; } serve ...
- mysql is not null 执行效率低
a表字段类型为int b表字段类型为varchar a left join b时如果查询条件是is not null,效率很快,is null 效率很低 后来两者改为同类型 int,效率很高
- ajax读本地文件
前置条件: 1. 编辑器,我用的是HbuilderX,解压即食,非常美味,点击传送门. 2. jQuery.min.js,点击传送门. 简单的项目目录: a. test.html内容 <!DOC ...
- 如何在3D场景中在模型上面绘制摄取点
有些时候,我们在屏幕上面绘制一个摄取点,在单屏玩游戏的模式下,我们并不能觉得有什么不妥.但是最近VR的热火朝天,我们带上眼镜看双屏的时候,总觉得这个摄取点看着很不舒服. 这个问题该怎么解决?在这里我首 ...
- java连接到sql sever 2008_java基础学习
(sql sever 2008跟sql sever 2005装载JDBC驱动的方法是一样的) 一.加载驱动的文字教程 1.准备相关的软件(Eclipse除外,开源软件可以从官网下载) <1> ...
- bi工具是什么,如何选择?
商业智能使用的一套方法和技术根据解决方案的目的而广泛多样化.有些工具专注于数据准备方面,可能包括ETL(提取,转换,加载)层,以更好地组织和利用数据.有些工具专注于更广泛的企业使用,可能专注于数据混 ...
- 企业如何建立一体化数据分析平台?还是得说说那几家BI工具
近年来,BI工具和报表工具犹如一股春风,吹遍了大江南北,成为了众多企业的发展利器,受到了企业决策者的拥戴.同时,在企业信息化需求日益旺盛的市场里也孕育了不少BI工具与报表工具厂商.商业智能的应用在国外 ...
- Mono创始人 Miguel de Icaza今天离开微软
2016年,微软突然宣布收购移动工具开发商Xamarin,后者是位于美国加利福尼亚,据称微软收购Xamarin交易价格在4亿到5亿美元之间.因此,微软获得了著名的开源倡导者和开发人员Miguel de ...