package com.exmaple;
/**
* 浮点数运算
*/
public class FloatArithmetic {
public static void main(String[] args) {
/*
* 1、我们代码中的十进制数最终都会转成二进制数进行操作
* 2、浮点数往往无法精确用二进制数表达,正因为如此,浮点数的计算可能会跟认知有所不同
* 3、因为浮点数无法精确用二进制数表达,所以往往取一个接近于浮点数值的二进制数去表示,正因为如此,
* 浮点数的计算结果跟认知中有所偏差
* 4、比较一个浮点数的方法
*/
double x = 1.0 / 10;
double y = 1 - 9.0 / 10;
// 观察x和y是否相等:
System.out.println(x); //0.1
System.out.println(y); //0.09999999999999998
/*
* 类型提升
* 1、整型跟浮点型进行运算会把整型转成浮点型在进行运算
* 2、char类型与浮点型进行运算会先把char类型转成int类型在转成浮点型
* 3、类型提升没有主动性
*/
long a = 1;
double b = 2.0;
// long c = a + b; 编译错误 运算结果应该是double却用long类型接收
char a1 = 64;
// int c1 = a1 + b; 编译错误 char -> int -> double
//理论上a2/b2=6.5,但是java并不会把两个整型运算结果自动提升为浮点型,所以只取6舍弃了小数部分
int a2 = 13;
int b2 = 2;
System.out.println(a2/b2); //6
/*
类型强转
1、浮点型转整型,舍弃小数部分取整(不会四舍五入)
2、浮点型转byte、short、char会先转成int类型在转成对应类型,防止数据溢出
3、浮点型转long类型会直接强转成long类型不会有先转int类型这一步
4、浮点型强转int/long类型时,如果超过int/long类型表示范围,则返回int/long能表示的最大值
*/
double a3 = 2.4;
double b3 = 2.5;
double c3 = 2.6;
System.out.println("a3=" + (int)a3); //2
System.out.println("b3=" + (int)b3); //2
System.out.println("c3=" + (int)c3); //2
double a4 = 128.19;
//a4会先转成int类型(128),int类型在强转byte类型,因为超过byte的表示范围,数据溢出,结果为-128
System.out.println("a4=" + (byte)a4); //-128
double a5 = 1.2e20;
//a5强转成int类型会超过int类型的表示范围,这个时候java会返回int类型的最大值
System.out.println("a5=" + (int)a5); //2147483647
//返回long类型能表示的最大值
System.out.println("a5=" + (long)a5); //9223372036854775807
/*
由于浮点数存在运算误差,所以比较两个浮点数是否相等常常会出现错误的结果。正确的比较方法是判断两个浮点数之差的绝对值是否小于一个很小的数:
*/
//比较x和y是否相等,先计算其差的绝对值:
double r = Math.abs(x - y);
// 再判断绝对值是否足够小:
if (r < 0.00001) {
// 可以认为相等
} else {
// 不相等
}
}
}
Java基础days02--浮点型运算
最新推荐文章于 2024-09-07 12:59:11 发布