由于float 是单精度浮点小数,而double 是双精度浮点小数
单精度型能精确到七位,而双精度能精确到15位。用户在选用这些数据类型时,要注意变量所取值的范围。并且数值为整数时,为了运算速度,不用把变量硬定义为浮点型。
如果要将Float和Double之间相互转型,java 提供了一下方法Float.doubleValue()和Double.floatValue()
查看JDK1.6中对其方法进行这样解释
Float.doubleValue()
public double doubleValue()
Float 对象的 double 值。 Number 中的
doubleValuefloat 值被转换为 double 类型,并返回转换的结果。public float floatValue()
Double 对象的 float 值。 Number 中的
floatValuefloat 类型的由此对象所表示的 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()+"")以保留单精度数据的准确性
而在双精度转单精度的时候,未发现错误的数据。基本可以和单精度是一样的。
终于写完了。。。。此文章主要是写给新手们看的。。。如有更好的解决办法可以直接评论。。。。。以便大家学习。。。。。
原文地址:http://blog.csdn.net/liang_henry/article/details/46042863