java Float和Double 之间的相互转型问题
来源:互联网 发布:淘宝网商银行贷款 编辑:程序博客网 时间:2024/05/18 19:18
由于float 是单精度浮点小数,而double 是双精度浮点小数
单精度型能精确到七位,而双精度能精确到15位。用户在选用这些数据类型时,要注意变量所取值的范围。并且数值为整数时,为了运算速度,不用把变量硬定义为浮点型。
如果要将Float和Double之间相互转型,java 提供了一下方法Float.doubleValue()和Double.floatValue()
查看JDK1.6中对其方法进行这样解释
Float.doubleValue()
public double doubleValue()
- 返回此
Float
对象的double
值。 - 指定者:
- 类
Number
中的doubleValue
- 返回:
- 此对象表示的
float
值被转换为double
类型,并返回转换的结果。
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.114.10000038146972714.114.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.114.10000038146972714.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.11111114.1111106872558614.11111114.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.66666714.66666698455810514.66666714.66666714.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.77777814.77777767181396514.77777814.77777814.777777777777779
所以在大量数据的测试下,发现不管是单精度还是双精度准确的进位是无法确定的。
总结
在单精度转双精度的时候未防止补位问题采用
Double.parseDouble(f.floatValue()+"")以保留单精度数据的准确性
而在双精度转单精度的时候,未发现错误的数据。基本可以和单精度是一样的。
终于写完了。。。。此文章主要是写给新手们看的。。。如有更好的解决办法可以直接评论。。。。。以便大家学习。。。。。
1 0
- java Float和Double 之间的相互转型问题
- Java的float和double
- Java中float和double转换的问题?
- java解决double和float精度不准确的问题
- java float和double精度问题
- java中float,double的精度问题
- 关于float和double的精度问题
- float和double的精度问题
- 关于float和double的输入输出问题
- double和float转换的问题
- double和float的精度问题
- java的float和double的区别
- java控制float和double的精度
- Java中double和float的区别
- java中float和double的区别
- java中float 和double的区别
- java Byte和各数据类型(short,int,long,float,double)之间的转换
- java Byte和各数据类型(short,int,long,float,double)之间的转换
- Linux下nginx的安装和配置
- ReactiveCocoa 和 MVVM 入门
- 把写过的POJ代码都放到GitHub上了
- 收到的最委婉的拒信。。。。。。。。
- java圆形按钮的设计
- java Float和Double 之间的相互转型问题
- java IO流
- POJ之路5--1218THE DRUNK JAILER
- Opencv2 computer vision application programming cookbook<六>
- myeclipse build workspace太慢 , MyEclipse性能优化
- javaWeb开发过程中常用网站收藏
- 函数参数的传递问题(指针的指针)
- MP3之痛 -- Cocos2dx 游戏移植到 WP8 之路
- 面向对象---第一天