专栏首页Java典籍浮点型变量(float和double)和BigDecimal的使用

浮点型变量(float和double)和BigDecimal的使用

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{
         System.out.println("d1!=d2");
      }

上面程序运行结果表明,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典籍(helloHBLing),作者:冰湖一角

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 浅谈Java中switch分支语句

    在程序中遇到多分支选择的时候,想必大家都喜欢用if...else if...else...语句,尤其是初学者,因为在了解switch语句之前,我也是只会用if....

    硕人其颀
  • Java集合框架详解(全)

    集合可以看作是一种容器,用来存储对象信息。所有集合类都位于java.util包下,但支持多线程的集合类位于java.util.concurren...

    硕人其颀
  • SVN恢复历史版本及解决冲突方法

    前段时间有小伙伴们问我关于SVN恢复历史版本及解决冲突的问题,今天抽空就整理了一下,以为在此以前,有的小伙伴解决冲突使用的方法是:先把自己写的代码备份或删掉,更...

    硕人其颀
  • POJ 2208--Pyramids(欧拉四面体体积计算)

    Pyramids Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 344...

    Enterprise_
  • 【AI 引擎】苹果收购人工智能公司 | 沃尔沃展示半自动驾驶技术

    1.苹果收购人工智能公司Emotient:解读面部表情 ? 苹果公司已经收购了创业公司Emotient,后者可利用人工智能技术(AI)对人们的面部表情进行分析以...

    新智元
  • 【Keras速成】Keras图像分类从模型自定义到测试

    这一次我们讲讲keras这个简单、流行的深度学习框架,一个图像分类任务从训练到测试出结果的全流程。

    用户1508658
  • python3学习之反射

    py3study
  • Python3 基本数据类型

    Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。

    py3study
  • 本田公布104小时驾驶行为数据集:时间不长但胜在全面 | 附相关资源汇总

    本田最近与波士顿大学合作,公布了在旧金山湾区采集的104小时**驾驶行为数据集,总体积大约150GB。

    量子位
  • python3学习笔记(2)----p

    Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。 在 Python 中,变量就是变量,它没有类型,我们所说的"类型"...

    py3study

扫码关注云+社区

领取腾讯云代金券