java Float和Double 之间的相互转型问题

由于float 是单精度浮点小数,而double 是双精度浮点小数

单精度型能精确到七位,而双精度能精确到15位。用户在选用这些数据类型时,要注意变量所取值的范围。并且数值为整数时,为了运算速度,不用把变量硬定义为浮点型。

如果要将Float和Double之间相互转型,java 提供了一下方法Float.doubleValue()和Double.floatValue()

查看JDK1.6中对其方法进行这样解释

Float.doubleValue()

public double doubleValue()
返回此 Float 对象的 double 值。
指定者:
Number 中的 doubleValue
返回:
此对象表示的 float 值被转换为 double 类型,并返回转换的结果。
Double.floatValue()

public float floatValue()
返回此 Double 对象的 float 值。
指定者:
Number 中的 floatValue
返回:
转换为 float 类型的由此对象所表示的 double
从以下版本开始:
JDK1.0

先从一个简单的例子进行说明一下:

public static void main(String[] args) {
		Float f=new Float(14.1);
		System.out.println(f.floatValue());
		System.out.println(f.doubleValue());
		
		Double d = new Double(14.1);
		System.out.println(d.floatValue());
		System.out.println(d.doubleValue());
	}

输出的结果是:

14.1
14.100000381469727
14.1
14.1

这时,可以看到Float.doubleValue()时,数字是不准确的,应该是14.1,而结果14.10000381469727,这就是单精度转双精度的时候,双精度会对单精度进行补位。导致出现偏差。


我这时的解决办法是这样的

Float f=new Float(14.1);
System.out.println(f.floatValue());
System.out.println(f.doubleValue());
System.out.println(Double.parseDouble(f.floatValue()+""));
输出的结果

14.1
14.100000381469727
14.1


再看下一个例子


	public static void main(String[] args) {
		Float f=new Float(14.111111111111111111111111);
		System.out.println(f.floatValue());
		System.out.println(f.doubleValue());
		
		Double d = new Double(14.111111111111111111111111);
		System.out.println(d.floatValue());
		System.out.println(d.doubleValue());
	}

输出结果:

14.111111
14.11111068725586
14.111111
14.11111111111111

这时,由于小数点后面的位数过长,Float单精度和Double双精度都进行一次截位后进行计算,这时,Float.doubleValue()仍然出现补位问题,但是这次补位已经将原有数据给破坏掉了。

为了减少误差,将Float的数据转换成double数据时,还是采取上一个操作办法

System.out.println(Double.parseDouble(f.floatValue()+""));
输出的结果是

14.111111

再看下面的例子

	public static void main(String[] args) {
		Float f=new Float(14.6666666666666666666666666666666666666);
		System.out.println(f.floatValue());
		System.out.println(f.doubleValue());
		
		System.out.println(Double.parseDouble(f.floatValue()+""));
		
		Double d = new Double(14.6666666666666666666666666666666666666);
		System.out.println(d.floatValue());
		System.out.println(d.doubleValue());
	}

输出的结果是

14.666667
14.666666984558105
14.666667
14.666667
14.666666666666666

这时会发现当给出的数据超出单精度的位数时,会截取,截取后的数字剩下的第一位大于5时,必然进位(即最后一位+1),小于5时,必然不进位(即最后一位不变)。

而截取后的数字剩下的第一位等于5时,有时会进位,有时会不进位。(查看源码,未找出原因)

双精度在此数值时未进位


再看下面的例子

	public static void main(String[] args) {
		Float f=new Float(14.777777777777777777777777);
		System.out.println(f.floatValue());
		System.out.println(f.doubleValue());
		
		System.out.println(Double.parseDouble(f.floatValue()+""));
		
		Double d = new Double(14.77777777777777777777777777777);
		System.out.println(d.floatValue());
		System.out.println(d.doubleValue());
	}

这时的结果

14.777778
14.777777671813965
14.777778
14.777778
14.777777777777779

所以在大量数据的测试下,发现不管是单精度还是双精度准确的进位是无法确定的。


总结

在单精度转双精度的时候未防止补位问题采用

Double.parseDouble(f.floatValue()+"")
以保留单精度数据的准确性

而在双精度转单精度的时候,未发现错误的数据。基本可以和单精度是一样的。


终于写完了。。。。此文章主要是写给新手们看的。。。如有更好的解决办法可以直接评论。。。。。以便大家学习。。。。。





  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Java中的floatdouble都是用来表示浮点数的数据类型。但它们有一些重要的区别: 1. 精度不同:float类型有7位有效数字,而double类型有15位有效数字。这意味着double类型能够表示更精确的值。 2. 占用空间不同:float类型占用4个字节,而double类型占用8个字节。 3. 默认值不同:在Java中,float类型的默认值是0.0f,而double类型的默认值是0.0d。 总而言之,如果精度要求不高,可以使用float类型,如果精度要求较高,那么使用double类型。 ### 回答2: Java中的floatdouble都是用来表示浮点数的数据类型,但它们有一些区别。 1. 精度:double类型具有更高的精度,可以存储更长的小数位数,而float类型的精度相对较低。 2. 存储空间:float类型占用4个字节(32位),而double类型占用8个字节(64位),所以double类型可以表示比float类型更大范围的数值,但占用的存储空间也更多。 3. 范围:由于double类型的存储空间更大,所以它可以表示更大范围的数值,而float类型的范围相对较小。 4. 默认类型:在Java中,浮点数常量默认被认为是double类型,如果要声明一个float类型的变量,需要在数值后面添加"F"或"f"来表示。 5. 运算速度:由于double类型的精度更高,所以在进行复杂的数值计算时,double类型可能会比float类型更慢。 综上所述,double类型主要用于需要更高精度和更大范围的计算场景,而float类型则适用于对精度要求不高的场景,同时需要节省内存空间。在选择使用哪种类型时,需要根据具体的应用需求和性能要求来综合考虑。 ### 回答3: Java中的floatdouble是两种不同的数据类型,用于表示浮点数。 区别一:精度 float是单精度浮点数,占用4个字节(32位),可以表示大约6-7位的有效数字。而double是双精度浮点数,占用8个字节(64位),可以表示大约15-16位的有效数字。因此,double的精度比float更高,可以表示更大范围和更准确的小数。 区别二:范围 float类型的取值范围约为-3.4 x 10^38 到 3.4 x 10^38,而double类型的取值范围约为-1.7 x 10^308 到 1.7 x 10^308。也就是说,double的取值范围更大。 区别三:存储空间 由于double类型占用的存储空间是float的两倍,使用double类型会占用更多的内存。在内存限制较为严格的环境下,可以选择使用float类型以节省内存空间。 区别四:运算精度 在进行浮点数运算时,由于浮点数的精度限制,float类型的运算结果可能会出现更多的舍入误差。而double类型由于精度更高,舍入误差相对较小。 综上所述,当需要更高的精度和更大的取值范围时,应优先选择double类型。而在内存限制较为严格或对精度要求不高的情况下,可以选择float类型以节省内存空间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值