- 类
- 1.类的修饰符(用于控制类的访问权限和其他特性)、2.类名(类名必须与文件名相同)、3.类的成员变量(可以是基本类型如int、double,也可以是引用类型如String、Object)、4.类的方法(包括构造方法(用以初始化对象,与类名相同,无返回值)和普通方法(可以包括静态方法和实例方法)、5.类的访问修饰符......
- 可以。Java中的浮点数类型包括
float
和double
。浮点数类型之间可以进行自动类型转换,类似于整数类型。float
类型可以自动转换为double
类型,但将double
类型转换为float
类型时,需要进行强制类型转换,并可能导致精度损失在 - 在Java中String是一个类。可以使用
String
类的对象来创建和操作字符串,例如:String str = "Hello, World!";
5. java中,static表示“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,或者进行静态导包。static的特点:1、随着类的加载而被加载;2.优先于对象存在;3、被所有对象共享。
EnumTest.java
- 通过Size.SMALL和Size.LARGE创建了两个Size枚举类型的对象s和t,使用“==”和equals()方法直接比对枚举变量的值,换句话说,对于枚举类型的变量,“==”和equals()方法执行的结果是等价的,所以输出false(?)
-
通过s.getClass().isPrimitive()方法判断s的类型是否为原始数据类型。由于枚举类型是一种特殊的数据类型(引用类型),而不是原始数据类型,所以输出结果为false。
-
通过Size.valueOf("SMALL")的方式将字符串"SMALL"转换为Size枚举类型的对象u,由于在枚举中,相同的值则引用同一个对象,所以输出true
-
通过Size.values()方法可以获取枚举类型的所有值,并通过循环遍历输出
我掌握了枚举类型的定义、枚举对象的创建和比较、枚举对象的转换、枚举对象的值遍历以及类型判断等知识点
-
计算+5和-5的原码、补码以及反码的步骤如下:
对于正数+5:
- 原码:直接将二进制表示写出来,最高位为0表示正数。+5的二进制表示为:00000101。
- 反码:反码与原码相同,因为+5是正数。+5的反码也是00000101。
- 补码:补码与原码相同,因为+5是正数。+5的补码也是00000101。
对于负数-5:
- 原码:将负数的绝对值转换为二进制形式,并在最高位设置为1表示负数。-5的绝对值为5的二进制形式为00000101,最高位设置为1后,得到原码10000101。
- 反码:反码是将原码中除符号位外的每一位取反。-5的反码是11111010。
- 补码:补码是在反码的基础上,将最低位加1。-5的补码是11111011。
在Java中,整数采用补码表示。这意味着所有的正数都是正常的二进制表示,而负数则是其对应正数的补码表示。
以下是代码测试:
idea输出的中文有些问题了/(ㄒoㄒ)/~~(图先发了,等我设置好了再换图)
将正数5和负数-5进行了不同的位操作,输出结果与手工计算的结果进行比对,以验证Java中采用的是补码表示。
输出的是函数内的局部变量,其只作用于这个函数内。
byte
(8位):表示范围为-128到127。short
(16位):表示范围为-32,768到32,767。int
(32位):表示范围为-2,147,483,648到2,147,483,647。long
(64位):表示范围为-9,223,372,036,854,775,808到9,223,372,036,854,775,807。float
(32位):IEEE 754标准单精度浮点数,可以表示大约±3.40282347E+38F的数值。double
(64位):IEEE 754标准双精度浮点数,可以表示大约±1.79769313486231570E+308的数值。boolean
(1位):表示true
或false
。- 结论:范围更小的类型能转化为范围更大的类型,一般情况下无精度损失;但是整数转化为浮点数还是会有精度损失,因为浮点数可能会丢失精度,因为浮点是的十进制值通常没有完全相同的二进制表示形式(十进制数的二进制表示形式不精确),浮点数存储是由指数和尾数构成
意外(doge
这些结果之所以不完全等于我们期望的结果,是因为浮点数在计算机中以二进制形式表示时存在一定的精度限制。
由于浮点数使用有限的二进制位数进行近似表示,无法精确地表示某些十进制小数值。这种近似表示可能会导致舍入误差。
在例子中,0.05、0.01、0.42等十进制小数无法精确地表示为有限的二进制小数。因此,进行浮点数运算时,结果可能略微偏离所期望的精确值。
例如,0.05 + 0.01的精确结果是0.06,但由于二进制表示的近似性,得到的结果是0.060000000000000005。
对于需要精确计算的场景,比如货币计算或精确科学计算,应该使用BigDecimal
类来进行高精度计算,而不是使用浮点数类型。BigDecimal
提供了任意精度的十进制数计算,并且不会出现浮点数舍入误差的问题。
BigDecimal
是Java中提供的一个用于高精度数值计算的类。它可以表示任意精度的十进制数,且不会出现浮点数舍入误差。BigDecimal
类位于java.math
包中。
使用BigDecimal
类进行高精度计算时,通常需要按照以下步骤进行:
-
导入
BigDecimal
类:在Java源文件的开头处导入java.math.BigDecimal
类,以便在代码中直接使用。 -
创建
BigDecimal
对象:使用BigDecimal
的构造方法来创建BigDecimal
对象,可以传入字符串表示的数值或使用其他支持的数据类型作为参数。例如:BigDecimal num1 = new BigDecimal("0.05"); BigDecimal num2 = new BigDecimal("0.01");
-
执行高精度计算:使用
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对象时,仍然存在转换和舍入误差的风险。原因如下:
-
浮点数转换误差:
浮点数确实使用了二进制形式的存储,在CPU中,浮点数采用IEEE 754标准来表示,它包含指数和尾数两部分。在Java中,
double
类型使用64位来存储浮点数,其中一部分用于指数,另一部分用于尾数。由于浮点数采用有限的二进制位数来表示实数,因此无法精确地表示一些十进制小数。这意味着某些十进制小数无法转换为精确的二进制表示形式。因此,浮点数的内部表示是一个近似值,这可能导致精度损失。
当我们将一个数值写入
double
类型时,会将其转换为最接近的二进制浮点数表示形式。在这个转换过程中,可能会发生舍入误差,导致精度损失。这种舍入误差是不可预知的,因为它取决于具体的数值和浮点数的表示规则。 - 舍入误差:在构建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"。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现