float数据类型是单精度32位IEEE 754浮点,而double数据类型是双精度64位IEEE 754浮点。
这是什么意思?我什么时候应该使用float而不是double?
double
而不是使float
您避免了与精度相关的错误,那是值得的。
float数据类型是单精度32位IEEE 754浮点,而double数据类型是双精度64位IEEE 754浮点。
这是什么意思?我什么时候应该使用float而不是double?
double
而不是使float
您避免了与精度相关的错误,那是值得的。
Answers:
在维基百科页面上这是一个良好的开端。
总结一下:
float
以32位表示,带有1个符号位,8个指数位和23位有效数(或从科学记号中得出的结果:2.33728 * 10 12; 33728为有效数)。
double
用64位表示,带有1个符号位,11个指数位和52个有效位。
默认情况下,Java double
用来表示其浮点数字(因此3.14
键入文字double
)。这也是数据类型,它将为您提供更大的数字范围,因此,我强烈建议在上使用它float
。
有可能是某些库,实际上迫使你的使用float
,但一般-除非你能保证你的结果将是小到足以适应float
的规定范围,那么最好与选择double
。
如果您需要准确性-例如,您不能使用不正确的十进制值(例如1/10 + 2/10
),或者您正在使用货币进行任何操作(例如,在系统中表示$ 10.33),则使用BigDecimal
,可以支持任意精度和类似情况的优雅处理。
*100
。拜托,您在这里有个要点,但您可以更精确吗:)
浮点数,也称为实数,用于评估需要小数精度的表达式。例如,诸如平方根之类的计算,或诸如正弦和余弦之类的超越计算,会得出其精度需要浮点类型的值。Java实现了标准(IEEE–754)浮点类型和运算符集。有两种浮点类型,浮点型和双精度型,分别代表单精度和双精度数。它们的宽度和范围如下所示:
Name Width in Bits Range
double 64 1 .7e–308 to 1.7e+308
float 32 3 .4e–038 to 3.4e+038
浮动
float类型指定使用32位存储的单精度值。单精度在某些处理器上更快,并且占用的空间是双精度的一半,但是当值很大或很小时,它将变得不精确。当您需要小数部分但不需要很高的精度时,float类型的变量很有用。
以下是一些示例float变量声明:
浮于高温,低温;
双
如double关键字所示,双精度使用64位存储值。实际上,在一些针对高速数学计算进行了优化的现代处理器上,双精度比单精度要快。所有先验数学函数(例如sin(),cos()和sqrt())都返回双精度值。当您需要在许多迭代计算中保持准确性,或者要处理大数值时,双精度是最佳选择。
尽管如此,Java似乎还是倾向于使用double进行计算:
以我今天早些时候编写的程序为例,当我使用float时这些方法不起作用,但是当我用double替换float(在NetBeans IDE中)时,现在可以很好地工作:
package palettedos;
import java.util.*;
class Palettedos{
private static Scanner Z = new Scanner(System.in);
public static final double pi = 3.142;
public static void main(String[]args){
Palettedos A = new Palettedos();
System.out.println("Enter the base and height of the triangle respectively");
int base = Z.nextInt();
int height = Z.nextInt();
System.out.println("Enter the radius of the circle");
int radius = Z.nextInt();
System.out.println("Enter the length of the square");
long length = Z.nextInt();
double tArea = A.calculateArea(base, height);
double cArea = A.calculateArea(radius);
long sqArea = A.calculateArea(length);
System.out.println("The area of the triangle is\t" + tArea);
System.out.println("The area of the circle is\t" + cArea);
System.out.println("The area of the square is\t" + sqArea);
}
double calculateArea(int base, int height){
double triArea = 0.5*base*height;
return triArea;
}
double calculateArea(int radius){
double circArea = pi*radius*radius;
return circArea;
}
long calculateArea(long length){
long squaArea = length*length;
return squaArea;
}
}
这将产生错误:
public class MyClass {
public static void main(String args[]) {
float a = 0.5;
}
}
/MyClass.java:3:错误:不兼容的类型:可能有损从double转换为float float a = 0.5;
这将很好地工作
public class MyClass {
public static void main(String args[]) {
double a = 0.5;
}
}
这也将很好地工作
public class MyClass {
public static void main(String args[]) {
float a = (float)0.5;
}
}
原因:Java默认情况下将实数存储为两倍,以确保更高的精度。
Double占用更多空间,但在计算过程中更精确,而float占用更少空间,但精度不高。
本示例说明了如何从Java的float中提取符号(最左边的位),指数(后面的8位)和尾数(最右边的23位)。
int bits = Float.floatToIntBits(-0.005f);
int sign = bits >>> 31;
int exp = (bits >>> 23 & ((1 << 8) - 1)) - ((1 << 7) - 1);
int mantissa = bits & ((1 << 23) - 1);
System.out.println(sign + " " + exp + " " + mantissa + " " +
Float.intBitsToFloat((sign << 31) | (exp + ((1 << 7) - 1)) << 23 | mantissa));
相同的方法可以用于double运算(11位指数和52位尾数)。
long bits = Double.doubleToLongBits(-0.005);
long sign = bits >>> 63;
long exp = (bits >>> 52 & ((1 << 11) - 1)) - ((1 << 10) - 1);
long mantissa = bits & ((1L << 52) - 1);
System.out.println(sign + " " + exp + " " + mantissa + " " +
Double.longBitsToDouble((sign << 63) | (exp + ((1 << 10) - 1)) << 52 | mantissa));