java 浮点型对象,Java Float Double 类型详解

Float类

Float 类在对象中包装了一个基本类型 float 的值。Float 类对象包含一个 float 类型的字段。此外,该类提供了多个方法,能在 float 类型与 String 类型之间互相转换,同时还提供了处理 float 类型时比较常用的常量和方法。

Float 类的构造方法

Float 类中的构造方法有以下 3 个。

Float(double value):构造一个新分配的 Float 对象,它表示转换为 float 类型的参数。

Float(float value):构造一个新分配的 Float 对象,它表示基本的 float 参数。

Float(String s):构造一个新分配的 Float 对象,它表示 String 参数所指示的 float 值。

例如,以下代码分别使用以上 3 个构造方法获取 Float 对象:

Float float1 = new Float(3.14145);

// 以 double 类型的变量作为参数创建 Float 对象Float float2 = new Float(6.5);

// 以 float 类型的变量作为参数创建 Float 对象Float float3 = new Float("3.1415");

// 以 String 类型的变量作为参数创建 Float 对象

在 Float 类内部包含了一些和 float 操作有关的方法,见表 1。

方法

返回值

功能

byteValue()

byte

以 byte 类型返回该 Float 的值

doubleValue()

double

以 double 类型返回该 Float 的值

floatValue()

float

以 float 类型返回该 Float 的值

intValue()

int

以 int 类型返回该 Float 的值(强制转换为 int 类型)

longValue()

long

以 long 类型返回该 Float 的值(强制转换为 long 类型)

shortValue()

short

以 short 类型返回该 Float 的值(强制转换为 short 类型)

isNaN()

boolean

如果此 Float 值是一个非数字值,则返回 true,否则返回 false

isNaN(float v)

boolean

如果指定的参数是一个非数字值,则返回 true,否则返回 false

toString()

String

返回一个表示该 Float 值的 String 对象

valueOf(String s)

Float

返回保存指定的 String 值的 Float 对象

parseFloat(String s)

float

将数字字符串转换为 float 数值

例如,将字符串 456.7 转换为 float 类型的数值,或者将 float 类型的数值 123.4 转换为对应的字符串,以下代码演示如何实现这两种功能:

String str = "456.7";float num = Float.parseFloat(str);

// 将字符串转换为 float 类型的数值float f = 123.4f;

String s = Float.toString(f); // 将 float 类型的数值转换为字符串

注意:在实现将字符串转换为 float 类型数值的过程中,如果字符串中包含非数值类型的字符,则程序执行将出现异常。

Float 类的常用常量

在 Float 类中包含了很多常量,其中较为常用的常量如下。

MAX_VALUE:值为 1.4E38 的常量,它表示 float 类型能够表示的最大值。

MIN_VALUE:值为 3.4E-45 的常量,它表示 float 类型能够表示的最小值。

MAX_EXPONENT:有限 float 变量可能具有的最大指数。

MIN_EXPONENT:标准化 float 变量可能具有的最小指数。

MIN_NORMAL:保存 float 类型数值的最小标准值的常量,即 2-126。

NaN:保存 float 类型的非数字值的常量。

SIZE:用来以二进制补码形式表示 float 值的比特位数。

TYPE:表示基本类型 float 的 Class 实例。

下面的代码演示了 Float 类中常量的使用。

float max_value = Float.MAX_VALUE;

// 获取 float 类型可取的最大值float min_value = Float.MIN_VALUE;

// 获取 float 类型可取的最小值float min_normal = Float.MIN_NORMAL;

// 获取 float 类型可取的最小标准值float size = Float.SIZE;

// 获取 float 类型的二进制位

Double类

Double 类在对象中包装了一个基本类型 double 的值。Double 类对象包含一个 double 类型的字段。此外,该类还提供了多个方法,可以将 double 类型与 String 类型相互转换,同时 还提供了处理 double 类型时比较常用的常量和方法。

Double 类的构造方法

Double 类中的构造方法有如下两个。

Double(double value):构造一个新分配的 Double 对象,它表示转换为 double 类型的参数。

Double(String s):构造一个新分配的 Double 对象,它表示 String 参数所指示的 double 值。

例如,以下代码分别使用以上两个构造方法获取 Double 对象:

Double double1 = new Double(5.456);

// 以 double 类型的变量作为参数创建 Double 对象Double double2 = new Double("5.456");

// 以 String 类型的变量作为参数创建 Double 对象

Double 类的常用方法

在 Double 类内部包含一些和 double 操作有关的方法,见表 1。

方法

返回值

功能

byteValue()

byte

以 byte 类型返回该 Double 的值

doubleValue()

double

以 double 类型返回该 Double 的值

fioatValue()

float

以 float 类型返回该 Double 的值

intValue()

int

以 int 类型返回该 Double 的值(强制转换为 int 类型)

longValue()

long

以 long 类型返回该 Double 的值(强制转换为 long 类型)

shortValue()

short

以 short 类型返回该 Double 的值(强制转换为 short 类型)

isNaN()

boolean

如果此 Double 值是一个非数字值,则返回 true,否则返回 false

isNaN(double v)

boolean

如果指定的参数是一个非数字值,则返回 true,否则返回 false

toString()

String

返回一个表示该 Double 值的 String 对象

valueOf(String s)

Double

返回保存指定的 String 值的 Double 对象

parseDouble(String s)

double

将数字字符串转换为 Double 数值

例如,将字符串 56.7809 转换为 double 类型的数值,或者将 double 类型的数值 56.7809 转换为对应的字符串,以下代码演示如何实现这两种功能:

String str = "56.7809";double num = Double.parseDouble(str);

// 将字符串转换为 double 类型的数值double d = 56.7809;String s = Double.toString(d);

// 将double类型的数值转换为字符串

在将字符串转换为 double 类型的数值的过程中,如果字符串中包含非数值类型的字符,则程序执行将出现异常。

Double 类的常用常量

在 Double 类中包含了很多常量,其中较为常用的常量如下。

MAX_VALUE:值为 1.8E308 的常量,它表示 double 类型的最大正有限值的常量。

MIN_VALUE:值为 4.9E-324 的常量,它表示 double 类型数据能够保持的最小正非零值的常量。

NaN:保存 double 类型的非数字值的常量。

NEGATIVE_INFINITY:保持 double 类型的负无穷大的常量。

POSITIVE_INFINITY:保持 double 类型的正无穷大的常量。

SIZE:用秦以二进制补码形式表示 double 值的比特位数。

TYPE:表示基本类型 double 的 Class 实例。

Java中 float、double使用注意问题

在java中运行一下代码

System.out.println(2.00-1.10);

输出的结果是:0.8999999999999999

很奇怪,并不是我们想要的值0.9

再运行如下代码:

System.out.println(2.00f-1.10f);

输出结果:0.9

又正确了,为什么会导致这种问题?程序中为什么要尽量避免浮点数比较?

在java中浮点型默认是double的,及2.00和1.10都要在计算机里转换进行二进制存储,这就涉及到数据精度,出现这个现象的原因正是浮点型数据的精度问题。先了解下float、double的基本知识:

1.float和double是java的基本类型,用于浮点数表示,在java中float占4个字节32位,double占8个字节64位,一般比较适合用于工程测量计算中,其在内存里的存储结构如下:

float:

符号位(1 bit)

指数(8 bit)

尾数(23 bit)

double:

符号位(1 bit)

指数(11 bit)

尾数(52 bit)

注意:从左到右是从低位到高位,而在计算机内部是采用逆序存储的。

2.System.out.println(2.00-1.10);中的1.10不能被计算机精确存储,以double类型数据1.10举例计算机如何将浮点型数据转换成二进制存储,

这里重点讲小数部分转换成二进制:

1.10整数部分就是1,转换成二进制1(这里整数转二进制不再赘述)

小数部分:0.1

0.12=0.2取整数部分0,基数=0.2

0.22=0.4取整数部分0,基数=0.4

0.42=0.8取整数部分0,基数=0.8

0.82=1.6取整数部分1,基数=1.6-1=0.6

0.62=1.2取整数部分1,基数=1.2-1=0.2

0.22=0.4取整数部分0,基数=0.4

.

.

.

.

直至基数为0。1.1用二进制表示为:1.000110...xxxx....(后面表示省略)

0.1 = 02^(-1)+02^(-2)+02^(-3)+12^(-4)+.........而double类型表示小数部分只有52位,当向后计算 52位后基数还不为0,那后面的部分只能舍弃,从这里可以看出float、double并不能准确表示每一位小数,对于有的小数只能无限趋向它。在计算机 中加减成除运算实际上最后都要在计算机中转换成二进制的加运算,由此,当计算机运行System.out.println(2.00-1.10);

时会拿他们在计算机内存中的二进制表示计算,而1.10的二进制表示本身就不准确,所以会出现0.8999999999999999的结果。

但为什么System.out.println(2.00f-1.10f);得出的结果是0.9呢。因为float精度没有double精度那么大,小数部分0.1二进制表示被舍去的比较多。

注意:

程序中应尽量避免浮点数的比较

float、double类型的运算往往都不准确

解决方法:

使用BigDecimal提供的方法进行比较或运算,但要注意在构造BigDecimal的时候使用float、double的字符串形式构建,BigDecimal(String val);为什么不用BigDecimal(double val)API里写的比较清楚。

运算以减法为例:

BigDecimal b1 = new BigDecimal(Double.toString(2.00));

BigDecimal b2 = new BigDecimal(Double.toString(1.10));

double result = b1.subtract(b2).doubleValue();

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值