po3a  

 

  1. 1.类的修饰符(用于控制类的访问权限和其他特性)、2.类名(类名必须与文件名相同)、3.类的成员变量(可以是基本类型如int、double,也可以是引用类型如String、Object)、4.类的方法(包括构造方法(用以初始化对象,与类名相同,无返回值)和普通方法(可以包括静态方法和实例方法)、5.类的访问修饰符......
  2. 可以。Java中的浮点数类型包括floatdouble。浮点数类型之间可以进行自动类型转换,类似于整数类型。float类型可以自动转换为double类型,但将double类型转换为float类型时,需要进行强制类型转换,并可能导致精度损失在
  3. 在Java中String是一个类。可以使用String类的对象来创建和操作字符串,例如:
    String str = "Hello, World!";

         5. java中,static表示“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,或者进行静态导包。static的特点:1、随着类的加载而被加载;2.优先于对象存在;3、被所有对象共享。

EnumTest.java

 

 

 

  1. 通过Size.SMALL和Size.LARGE创建了两个Size枚举类型的对象s和t,使用“==”和equals()方法直接比对枚举变量的值,换句话说,对于枚举类型的变量,“==”和equals()方法执行的结果是等价的,所以输出false(
  2. 通过s.getClass().isPrimitive()方法判断s的类型是否为原始数据类型。由于枚举类型是一种特殊的数据类型(引用类型),而不是原始数据类型,所以输出结果为false。

  3. 通过Size.valueOf("SMALL")的方式将字符串"SMALL"转换为Size枚举类型的对象u,由于在枚举中,相同的值则引用同一个对象,所以输出true

  4. 通过Size.values()方法可以获取枚举类型的所有值,并通过循环遍历输出

我掌握了枚举类型的定义、枚举对象的创建和比较、枚举对象的转换、枚举对象的值遍历以及类型判断等知识点

  1.  

     

    计算+5和-5的原码、补码以及反码的步骤如下:

    对于正数+5:

    1. 原码:直接将二进制表示写出来,最高位为0表示正数。+5的二进制表示为:00000101。
    2. 反码:反码与原码相同,因为+5是正数。+5的反码也是00000101。
    3. 补码:补码与原码相同,因为+5是正数。+5的补码也是00000101。

    对于负数-5:

    1. 原码:将负数的绝对值转换为二进制形式,并在最高位设置为1表示负数。-5的绝对值为5的二进制形式为00000101,最高位设置为1后,得到原码10000101。
    2. 反码:反码是将原码中除符号位外的每一位取反。-5的反码是11111010。
    3. 补码:补码是在反码的基础上,将最低位加1。-5的补码是11111011。

在Java中,整数采用补码表示。这意味着所有的正数都是正常的二进制表示,而负数则是其对应正数的补码表示。

以下是代码测试:

 idea输出的中文有些问题了/(ㄒoㄒ)/~~(图先发了,等我设置好了再换图)

将正数5和负数-5进行了不同的位操作,输出结果与手工计算的结果进行比对,以验证Java中采用的是补码表示。

 

 

 输出的是函数内的局部变量,其只作用于这个函数内。

 

  1. byte(8位):表示范围为-128到127。
  2. short(16位):表示范围为-32,768到32,767。
  3. int(32位):表示范围为-2,147,483,648到2,147,483,647。
  4. long(64位):表示范围为-9,223,372,036,854,775,808到9,223,372,036,854,775,807。
  5. float(32位):IEEE 754标准单精度浮点数,可以表示大约±3.40282347E+38F的数值。
  6. double(64位):IEEE 754标准双精度浮点数,可以表示大约±1.79769313486231570E+308的数值。
  7. boolean(1位):表示truefalse
  8.  结论:范围更小的类型能转化为范围更大的类型,一般情况下无精度损失;但是整数转化为浮点数还是会有精度损失,因为浮点数可能会丢失精度,因为浮点是的十进制值通常没有完全相同的二进制表示形式(十进制数的二进制表示形式不精确),浮点数存储是由指数和尾数构成

 

 

 

 意外(doge

这些结果之所以不完全等于我们期望的结果,是因为浮点数在计算机中以二进制形式表示时存在一定的精度限制。

由于浮点数使用有限的二进制位数进行近似表示,无法精确地表示某些十进制小数值。这种近似表示可能会导致舍入误差。

在例子中,0.05、0.01、0.42等十进制小数无法精确地表示为有限的二进制小数。因此,进行浮点数运算时,结果可能略微偏离所期望的精确值。

例如,0.05 + 0.01的精确结果是0.06,但由于二进制表示的近似性,得到的结果是0.060000000000000005。

对于需要精确计算的场景,比如货币计算或精确科学计算,应该使用BigDecimal类来进行高精度计算,而不是使用浮点数类型。BigDecimal提供了任意精度的十进制数计算,并且不会出现浮点数舍入误差的问题。

BigDecimal是Java中提供的一个用于高精度数值计算的类。它可以表示任意精度的十进制数,且不会出现浮点数舍入误差。BigDecimal类位于java.math包中。

使用BigDecimal类进行高精度计算时,通常需要按照以下步骤进行:

  1. 导入BigDecimal类:在Java源文件的开头处导入java.math.BigDecimal类,以便在代码中直接使用。

  2. 创建BigDecimal对象:使用BigDecimal的构造方法来创建BigDecimal对象,可以传入字符串表示的数值或使用其他支持的数据类型作为参数。例如:

    BigDecimal num1 = new BigDecimal("0.05");
    BigDecimal num2 = new BigDecimal("0.01");
  3. 执行高精度计算:使用BigDecimal提供的方法执行所需的计算操作,如加法、减法、乘法、除法等。这些方法会返回一个新的BigDecimal对象,表示计算结果。例如:

    BigDecimal sum = num1.add(num2);  // 加法
    BigDecimal difference = num1.subtract(num2); // 减法
    BigDecimal product = num1.multiply(num2); // 乘法
    BigDecimal quotient = num1.divide(num2); // 除法

    可以根据具体需要选择适当的计算方法,并将结果保存在新的BigDecimal对象中。

4.获取计算结果:通过调用BigDecimal对象的相应方法来获取计算的结果,如doubleValue()toString()等。例如:

double result = sum.doubleValue(); // 将结果转为double类型
String resultString = sum.toString(); // 将结果转为字符串

注意:为避免精度丢失,不推荐通过doubleValue()方法将BigDecimal转换为double进行计算结果的存储。如果需要进行进一步的计算或精确的值操作,建议继续使用BigDecimal对象。

 

 

当我们使用double数值来构建BigDecimal对象时,仍然存在转换和舍入误差的风险。原因如下:

  1. 浮点数转换误差:

    浮点数确实使用了二进制形式的存储,在CPU中,浮点数采用IEEE 754标准来表示,它包含指数和尾数两部分。在Java中,double类型使用64位来存储浮点数,其中一部分用于指数,另一部分用于尾数。

    由于浮点数采用有限的二进制位数来表示实数,因此无法精确地表示一些十进制小数。这意味着某些十进制小数无法转换为精确的二进制表示形式。因此,浮点数的内部表示是一个近似值,这可能导致精度损失。

    当我们将一个数值写入double类型时,会将其转换为最接近的二进制浮点数表示形式。在这个转换过程中,可能会发生舍入误差,导致精度损失。这种舍入误差是不可预知的,因为它取决于具体的数值和浮点数的表示规则。

  2. 舍入误差:在构建BigDecimal对象时,如果使用double数值作为参数进行构造,那么在转换过程中也可能会发生舍入误差。BigDecimal对象提供了不同的舍入模式(如ROUND_UP、ROUND_DOWN等),这会对结果产生影响。

因此,为了避免这些精度问题,通常建议使用字符串来构建BigDecimal对象。通过使用字符串,我们可以直接指定需要精确表示的数值,而不是通过浮点数的内部表示。例如,可以使用BigDecimal(String val)构造函数,将需要精确表示的数值作为字符串传递给它,从而确保结果的准确性。

 

这是因为在Java中,字符串连接操作符+的优先级比加法运算符+更高。因此,在第一次输出中,字符串 "X+Y=" 首先与变量 X 的字符串表示进行连接,得到字符串 "X+Y=100",然后再与变量 Y 的字符串表示进行连接,得到最终的字符串 "X+Y=100200"。

在第二次输出中,首先进行 X+Y 的加法运算,结果为 300,然后再将其与 "=X+Y" 的字符串进行连接,得到最终的字符串 "300=X+Y"。

 

posted on   po3a  阅读(52)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
 
点击右上角即可分享
微信分享提示