由于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
值
先从一个简单的例子进行说明一下:
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 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数据时,还是采取上一个操作办法
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时,有时会进位,有时会不进位。(查看源码,未找出原因)
双精度在此数值时未进位
再看下面的例子
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()+"")以保留单精度数据的准确性
而在双精度转单精度的时候,未发现错误的数据。基本可以和单精度是一样的。
终于写完了。。。。此文章主要是写给新手们看的。。。如有更好的解决办法可以直接评论。。。。。以便大家学习。。。。。