整数和浮点数_5

整数的表示

整数通常以 二进制补码 的形式存储,其中原码和反码存在+0和-0两个不同的值,而且加减法复杂。补码解决了上述问题

形式 定义
原码 最高位是符号位(0 表示正数,1 表示负数),其余位表示数值的绝对值
十进制 +5 的原码:00000101
十进制 -5 的原码:10000101
反码 正数的反码与原码相同,负数的反码是对其原码的符号位不变,其余位取反
十进制 +5 的反码:00000101
十进制 -5 的反码:11111010
补码 正数的补码与原码相同,负数的补码是对其反码加+1
十进制 +5 的补码:00000101
十进制 -5 的补码:11111011

浮点数的表示

浮点数在计算机中按照 IEEE 754 标准 存储

  • 浮点数的存储分为三部分:
    1. 符号位:表示正负。
    2. 指数位:表示科学计数法中的指数部分。
    3. 尾数位:表示科学计数法中的小数部分。
  • 例如,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
posted @ 2025-03-03 21:53  QAQ001  阅读(19)  评论(0)    收藏  举报