文章目录
- 一、比较float型与double型
- 二、Java与C语言的不同
- 三、float变量的声明
- 四、字符串与字符类型
- 五、算术混合运算的精度
一、比较float型与double型
float x = 0.4f;
double y = 0.4;
请问各位是不是感觉这两者好像是一样大的吧?
其实不然
因为:实际存储变量的时候,x中的数据是(保留16位小数)0.4000 0000 5960 4645,而此时y中的数据是(保留16位小数)0.4000 0000 0000 0000,y<x。
(为什么是16位小数呢?因为float与double进行比较会将float转换为double)
而出现0.4000 0000 5960 4645,这是由于float的精度不够。
eg:
我们可以写出2.25的内存分布:
符号位为:0
指数为1,用补码表示 0000 0001,转为移码就是1000 0001。
尾数位为0010 0000 0000 0000 0000 000
2.25的双精度表示为:0 100 0000 0001 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000,这样2.25在进行强制转换的时候,数值是不会变的;
而我们再看看2.2呢,2.2用科学计数法表示应该为:将十进制的小数转换为二进制的小数的方法为将小数2,取整数部分,所以0.282=0.4,所以二进制小数第一位为0.4的整数部分0,0.4×2=0.8,第二位为0,0.82=1.6,第三位为1,0.6×2 = 1.2,第四位为1,0.2*2=0.4,第五位为0,这样永远也不可能乘到=1.0,得到的二进制是一个无限循环的排列 00110011001100110011… ,对于单精度数据来说,尾数只能表示24bit的精度,所以2.2的float存储会出现误差!
在此感谢 张小琦 见博客
10进制小数如何转换为2进制:
十进制的小数转换为二进制,主要是小数部分乘以2,取整数部分依次从左往右放在小数点后,直至小数点后为0。
综上,所以产生了奇葩答案!
二、Java与C语言的不同
1、Java中的 System.out.println( ) 是无法跟C语言一样,加入什么%d之类的东西的,如果想加的话,应该调用Java里面的 System.out.printf()
2、Java允许使用 int型变量 来指定数组元素的个数,(而且Java中数组的定义也与C语言不同,这太过简单,请自行搜索)Java可以通过 数组名.length 直接得到 数组长度 。
3、Java中的成员变量是有默认值的,不同类型默认值不同。
eg:
int的默认值为0
布尔型默认值为false
4、char型的数组a,System.out.println(a)不会输出数组a的引用而是输出其全部元素的值。
想要输出char型数组的引用,必须让数组a和字符串做并置运算。
eg:
System.out.println(""+a);
三、float变量的声明
float变量的赋值不一定要加上 f/F 为后缀,当然,如果是用小数就必须得加后缀,如果不是小数其实是可以不用加的,因为没有小数点,那么其不会默认为double型。
eg:
float foo1 = -1;
float foo2 = 1;
float foo3 = 0x0123;
这些都是正确的声明方式。
四、字符串与字符类型
字符串用双引号,字符类型用单引号。
注意:在多个字符外使用单引号一定会报错!!!
在Java中,可以使用字符在Unicode表的排序位置的 16进制转义(需要用u做前缀),一般格式为 ‘\u****’ 。
五、算术混合运算的精度
1、如果表达式中有double型数据,则按double精度进行运算。
2、如果表达式中最高为float型数据,则按float精度进行运算。
3、如果表达式中最高精度为long型整数,则按long精度运算。
4、如果表达式中最高精度小于等于int型整数,则按int精度运算。