整数和浮点数_5
整数的表示
整数通常以 二进制补码 的形式存储,其中原码和反码存在+0和-0两个不同的值,而且加减法复杂。补码解决了上述问题
| 形式 | 定义 |
|---|---|
| 原码 | 最高位是符号位(0 表示正数,1 表示负数),其余位表示数值的绝对值 十进制 +5 的原码:00000101 十进制 -5 的原码:10000101 |
| 反码 | 正数的反码与原码相同,负数的反码是对其原码的符号位不变,其余位取反 十进制 +5 的反码:00000101 十进制 -5 的反码:11111010 |
| 补码 | 正数的补码与原码相同,负数的补码是对其反码加+1 十进制 +5 的补码:00000101 十进制 -5 的补码:11111011 |
浮点数的表示
浮点数在计算机中按照 IEEE 754 标准 存储
- 浮点数的存储分为三部分:
- 符号位:表示正负。
- 指数位:表示科学计数法中的指数部分。
- 尾数位:表示科学计数法中的小数部分。
- 例如,double类型使用 64 位存储:
- 1 位符号位。
- 11 位指数位。
- 52 位尾数位。
为什么计算机可以精确表示整数但是无法精确表示大部分小数?
- 首先整数为0,1,2等等的离散值
- 其次整数的 “基本单位” 为2的0次方、2的1次方等等,所有的整数都可以使用这些“基本单位”组合,所以计算机可以使用二进制来实现
- 小数是连续的,所以也是无限的,但电脑的二进制资源是有限的,所以不可能将所有的小数表示出来
- 小数的“基本单位”则为2的-1次方(0.5)、2的-2次方(0.25)等等,这些“基本单位”的组合只能表示相当少的一部分小数,所以计算机大部分时候只能无限逼近绝大部分小数比如0.1
如何在Java中精确表示小数
使用字符串构造 BigDecimal对象,然后使用相关方法进行加减乘除
//BigDecimal num3 = new BigDecimal(0.1);会有精度问题
BigDecimal num1 = new BigDecimal("0.1");
BigDecimal num2 = new BigDecimal("0.2");
// 加法
BigDecimal sum = num1.add(num2);//减法:subtract()
System.out.println("Sum: " + sum); // 输出 0.3
// 乘法
BigDecimal product = num1.multiply(num2);
System.out.println("Product: " + product); // 输出 0.02
// 除法(需要指定舍入模式)
BigDecimal quotient = num2.divide(num1, RoundingMode.HALF_UP);
System.out.println("Quotient: " + quotient); // 输出 2.0

浙公网安备 33010602011771号