Day08——类型转换、浮点数的精度问题
类型转换、浮点数的精度问题
由于 Java 是强类型语言,所以要进行有些运算的时候,需要用到类型转换。
类型的优先级
低----------------------------------------------------------->高
byte,short,char->int->long->float->double
运算中,不同类型的数据先转化为同一类型,然后进行运算。
自我测评
1.将int类型的128转换为byte类型
2.将char类型的‘a’转换为int类型
3.计算10亿乘20的准确结果
详细解释:
1.int转换为byte类型
//int转换为double
int i3=10;
double i4=i3;
System.out.println(i3);
System.out.println(i4);
System.out.println("====================================");
2.int转换为byte类型
//int转换为byte类型
int i1= 128;
byte i2=(byte)i1; //内存溢出——byte类型取值范围是 -128 到 127,超出范围
//强制转换 (类型)变量名!!!!! 高--->低
//自动转换 低--->高
System.out.println(i1); //i1=128
System.out.println(i2); //i2=-128
System.out.println("====================================");
3.转换时,浮点数的精度问题
//转换时,浮点数的精度问题
System.out.println((int)23.7); //23
System.out.println((int)-45.89f); //-45
转换时,精度问题是很重要的。
-
从大范围类型到小范围类型转换(缩小转换)导致精度丢失
- 当从
double类型转换为int类型时,会发生截断操作。例如,如果你有一个double值3.7,将其转换为int时,会直接丢弃小数部分,得到3。这是因为int类型无法存储小数部分,这种转换会导致信息丢失,也就是精度丢失。
- 当从
-
注意浮点数比较问题
不能直接使用
==来比较两个浮点数- 由于浮点数在计算机内部的存储方式,可能会出现一些看似奇怪的比较结果。例如,你可能会期望
0.1 + 0.2等于0.3,但在计算机中,由于double类型的存储和运算误差,实际上0.1 + 0.2得到的结果可能是一个非常接近0.3但不完全等于0.3的值。如果需要进行浮点数的比较,最好使用一个误差范围来判断两个浮点数是否相等。例如,可以定义一个很小的误差值(如epsilon = 0.000001),然后判断两个浮点数的差值的绝对值是否小于这个误差值来确定它们是否足够接近(即视为相等),而不是直接使用==来比较两个浮点数。这种方式可以在一定程度上避免因为浮点数精度问题导致的错误比较结果。
- 由于浮点数在计算机内部的存储方式,可能会出现一些看似奇怪的比较结果。例如,你可能会期望
类型转换的注意事项
1.不能对布尔值转换
2.不能把数据类型转换为不相干的类型
3.优先级高转换为低的时候,强制转换
4.在转换过程中,可能存在精度问题或者数据溢出问题
5.在 Java 中,把浮点数转换为整数时,会直接截断小数部分,即把小数点后面的数全部舍去,
强制类型转换
自动类型转换。
较大的数字计算
//在打出较大的整数数字时,可以用下划线分隔开,下划线不会输出
int i1=10_0000_0000; //十亿 每四位数有一个下划线分隔开
System.out.println(i1);
System.out.println("========================================");
//计算问题:每年赚10亿,20年一共赚多少?
int money=10_0000_0000;
int years=20;
int total=money*years;
System.out.println(total);//-1474836480
long total2=money*years; //转换为范围更大的long。
// 但money*years计算结果已经默认是int类型了,然后再转换为long类型,就有问题了
System.out.println(total2);//-1474836480
long total3=money*(long)years;
System.out.println(total3); //200_0000_0000---------正确计算,先把一个数转换为long类型
//在 Java 中,当一个 `long` 类型与一个 `int` 类型相乘时,结果为 `long` 类型。
//这是因为在 Java 的运算中,如果参与运算的数据类型不同,会自动进行类型提升,以确保计算的准确性和避免数据丢失。
// 由于 `long` 类型的取值范围大于 `int` 类型,所以计算结果会被提升为 `long` 类型。
注意点:
-
在打出较大数字时,可以用下划线分隔开,下划线不会输出。每四位数有一个下划线分隔开。如:10_0000_0000
-
long类型与int类型相乘,结果是long类型。
因为在 Java 的运算中,如果参与运算的数据类型不同,会自动进行类型提升,以确保计算的准确性和避免数据丢失。由于
long类型的取值范围大于int类型,所以计算结果会被提升为long类型表述范围小的可以自动转换为表述范围大的
在 Java 中,不同类型的数字进行加减乘除运算时,结果的类型遵循以下规则: **一、加法(+)** 1. 如果两个操作数中有一个是 `long` 类型,那么结果为 `long` 类型。 - 例如:`int a = 10; long b = 20; long result = a + b;`,结果 `result` 是 `long` 类型。 2. 如果两个操作数中有一个是 `double` 类型,那么结果为 `double` 类型。 - 例如:`int a = 10; double b = 20.5; double result = a + b;`,结果 `result` 是 `double` 类型。 3. 否则,如果两个操作数都是 `int`、`short`、`byte`、`char` 类型,结果为 `int` 类型。 - 例如:`short a = 10; short b = 20; int result = a + b;`,结果 `result` 是 `int` 类型。 **二、减法(-)** 与加法类似: 1. 如果两个操作数中有一个是 `long` 类型,那么结果为 `long` 类型。 2. 如果两个操作数中有一个是 `double` 类型,那么结果为 `double` 类型。 3. 否则,如果两个操作数都是 `int`、`short`、`byte`、`char` 类型,结果为 `int` 类型。 **三、乘法(*)** 1. 如果两个操作数中有一个是 `long` 类型,那么结果为 `long` 类型。 2. 如果两个操作数中有一个是 `double` 类型,那么结果为 `double` 类型。 3. 否则,如果两个操作数都是 `int`、`short`、`byte`、`char` 类型,结果为 `int` 类型。 **四、除法(/)** 1. 如果两个操作数中有一个是 `double` 类型,那么结果为 `double` 类型。 - 例如:`int a = 10; double b = 20.5; double result = a / b;`,结果 `result` 是 `double` 类型。 2. 如果两个操作数都是 `int`、`long`、`short`、`byte`、`char` 类型: - 对于整数除法,结果为整数类型,即如果两个操作数都是 `int`,结果为 `int`;如果两个操作数中有一个是 `long`,结果为 `long`。 - 例如:`int a = 10; int b = 3; int result = a / b;`,结果 `result` 是 `int` 类型,值为 3。`long c = 10L; long d = 3L; long result2 = c / d;`,结果 `result2` 是 `long` 类型。 需要注意的是,整数除法可能会导致精度丢失,因为它会截断小数部分。如果需要精确的除法结果,可以将操作数之一转换为 `double` 类型进行计算。 表述范围小的可以自动转换为表述范围大的
注意事项
不能直接将String类型强制转换为int类型!!!!!!!!!!!!!!!!!!!!
在 Java 中,将整数型的字符串(如: “123”)转换为整数通常使用Integer.parseInt()方法,它接收一个表示整数的字符串作为参数,并返回对应的整数值。
例如:
String a="123";
System.out.println(Integer.parseInt(a));//123

浙公网安备 33010602011771号