Java面试题之浮点数float
浮点数判断大小有陷阱,c语言float多少字节,因为底层的二进制数不能精确表示所有的小数。有时候会产生让人觉得莫名其妙的事情。,
Java 浮点数 float和double类型的表示范围和精度
对于double来说,8个字节,64位,0-51表示尾数,52-62(11位)表示指数,63位最高位表示符号位。
float和double的精度是由尾数的位数来决定的。
浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
double:2^52 = 4596,一共16位,同理,double的精度为16~17位。
10 进制中,无法准确表达 1/3:
2 进制中,也无法准确表达 0.1:
上述题目的计算过程
float 变量 a 和b 的比较是严格比较每一位上面的0和1,因此上述2个变量的比较是不相等的。
浮点数使用建议
货币之类的精确表示使用整型来存储,计算,表示上进行数值的相互转化。
尽量使用double,而不是 float,中间的计算结果,如果是局部变量,可以使用 double 来进行。但是,存储的时候,建议使用整型或BigDecimal。
float在内存中的存储遵循IEEE 754标准。在C/C++中,float类型占4个字节即32位 , 这32位分成了3部分:符号位:转化成二进制后,第31位。 0代表正数,1代表负数。阶码:30-23位,转化成规格化的二进制之后与
扩展思考
进一步提供几个代码示例:
(1)将 float 改用double 类型
public class DoublePrimitiveTest {
public static void main(String[] args) {
double a = 1.0 - 0.9;
double b = 0.9 - 0.8;
if(a == b){
System.out.println("true");
} else {
System.out.println("false");
}
if(a == 0.1){
System.out.println("a==0.1" + " true");
} else {
浮点类型的单精度值具有 4 个字节,包括一个符号位、一个 8 位 二进制指数和一个 23 位尾数。由于尾数的高顺序位始终为 1,因此它不是以数字形式存储的。此表示形式为 float 类型提供了一个大约在 -3.4E+38 ~ 3。.
System.out.println("a!=0.1");
}
System.out.println(a);
System.out.println(b);
}
}
输出结果:
true
一、int 占两个字节 范围:-32768~+32767 二、long占四个字节 范围:-2147483648~+2147483647 三、float占四个字节 范围:3.40E+38 ~ +3.40E+38 四、double占8个字节 范围:-1.79E+308 ~ +1.79E+308 51单片机。
a!=0.1
建议:
(2)改用BigDecimal 类型
import java.math.BigDecimal;
public class BigDecimalPrimitiveTest {
public static void main(String[] args) {
BigDecimal m = new BigDecimal(1.0);
-2147483648~2147483647)之间。float类型占用4字节内存,表示小数,数据范围在-2^128 ~ 2^128(-3.40E+38 ~ +3.40E+38 )之间。char类型占用1字节内存,表示字符,数据范围在-2^7~2^7-1(-128 ~127)之间。
BigDecimal n = new BigDecimal(0.9);
BigDecimal l = new BigDecimal(0.8);
BigDecimal a = m.subtract(n);
BigDecimal b = n.subtract(l);
if(a.equals(b)){
System.out.println("true");
} else {
System.out.println("false");
}
if(a.equals(new BigDecimal(0.1))){
System.out.println("a==0.1" + " true");
} else {
System.out.println("a!=0.1");
}
System.out.println(a);
float四个字节,
System.out.println(b);
}
}
输出结果:
true
问题一:C语言中定义的float是占四个字节,即三十二位,这个可定义的浮点数的范围是多少… 浮点数的范围是:2^(-32)到2^32-1 至于输搐结果,C语言默认的是输出输出8位(包括整数部份,小数点,小数总价),你也可以。
a!=0.1
BigDecimal的euquals方法是先判断要比较的数据类型,如果对象类型一致前提下同时判断精确度(scale)和值(BigInteger的equals方法)是否一致。