数据的处理方式
cpu是直接处理的二进制数据,数据的处理方式是 先转换成二进制计算,完成后再转换为十进制。
进制转换
1)十进制: 0 1 2 3 4 5 6 7 8 9
2)二进制:0 1
3)十六进制:0 1 2 3 4 5 6 7 8 9 A B C D E F
如何转换成十进制:
十进制数45876=4*104 + 5*103+8*102+7*101+6*100
二进制数101101= 1*25 +0*24+123+1*22+0*21+1*20=46
十六进制数D4A2 =D*163+ 4*162+A*161+2*100=54434
二进制数101101.101 = 1*25 +0*24+123+1*22+0*21+1*20+1*2-1+0*2-2 + 1*2-3 = 46 + 0.5 +0.25 + 0.125 =46.625
十进制转换成二进制:
1)整数:除2取整倒过来
2)小数:乘2取整顺着来
a.写出整数139的二进制数?
139/2 = 69 -------1
69/2 = 34 -------1
34/2 = 17 -------0
17/2 = 8 --------1
8/2 = 4 --------0
4/2 = 2---------0
2/2 = 1---------0
1/2 = 0---------1
**所以139的二进制数为10001011**
b.写出139.625的二进制数
0.625 * 2 = 1.25 ---------------1
0.25 * 2 = 0.5 ---------------0
0.5 * 2 = 1 ---------------1
**所以139.625得二进制数为10001011.101**
小数的精度丢失问题
// An highlighted block
package java_basic_for_Test;
public class DiginalType {
public static void main(String[] args) {
float flo = 12.543f;
System.out.println(flo);
}
}
//输出结果12.534
package java_basic_for_Test;
public class DiginalType {
public static void main(String[] args) {
float flo = 12.543f;
System.out.println(flo*1.0);
}
}
//输出结果为12.543000221252441
package java_basic_for_Test;
public class DiginalType {
public static void main(String[] args) {
float flo = 12.625f;
System.out.println(flo*1.0);
}
}
//输出结果为12.625
为什么12.543输出会是12.543000221252441的呢?
我们把12。534转换成二进制得到
12.534 = 1100.11010111000010.......
12.625 = 1100.101
我们会发现12.534小数部分的二进制时无线不循环的。
CPU处理浮点数的性能决定了运算的性能。
测试关注点
eg:WeChat红包的最大金额是200,我们可以试下199.9999999999999999这个数字的计算能力如何