新乡网站建设公司黄页,html5新手做的网页,公司注册查询入口官网网址,wordpress 导航文字图片java数据类型的转换以及精度丢失_long转double会丢失精度吗_ღLiJia的博客-CSDN博客
一.浮点类型在计算机当中的存储 float存储需求是4字节#xff08;32位#xff09;, 其中1位最高位是符号位#xff0c;中间8位表示阶位#xff0c;后32位表示值 float的范围: -2^128 ~ …java数据类型的转换以及精度丢失_long转double会丢失精度吗_ღLiJia的博客-CSDN博客
一.浮点类型在计算机当中的存储 float存储需求是4字节32位, 其中1位最高位是符号位中间8位表示阶位后32位表示值 float的范围: -2^128 ~ 2^128也即-3.40E38 ~ 3.40E38float的精度: 2^23 8388608一共七位这意味着最多能有7位有效数字但绝对能保证的为6位也即float的精度为6~7位有效数字double存储需求是8字节64为,其中1位最高位是符号位中间11位表示阶位后52位表示值 取值范围: -2^1024 ~ 2^1024也即-1.79E308 ~ 1.79E308 精度: 2^52 4503599627370496一共16位同理double的精度为15~16位long数据类型是64位有符号Java原始数据类型。 取值范围: -9223372036854775808到9223372036854775807 (”-2^64“ 到”2^64 -1) 精度丢失就是我们的位数不够表示我们整个数值了 问题原因 首先计算机进行的是二进制运算我们输入的十进制数字会先转换成二进制进行运算后再转换为十进制输出。Float和Double提供了快速的运算然而问题在于转换为二进制的时候位数不够表示我们整个数值有些数字不能完全转换只能无限接近于原本的值这就导致了在后来的运算会出现不正确结果的情况。 整体转换图 如图所示其中 实线byte→short、short→int、int→long、int→double、char→int、float→double转换是不会发生精度丢失的因为后者所包含的范围比前者大且完全包含前者。而虚线int转float、long转floatlong转double都会发生精度丢失。精度丢失包括两种一是有效数字丢失一是目标类型完全无法表示数据 原因如下 int和float都是32位但是内存结构也就是存储结构是不一样的float只有24含隐含的一位整数位位来确定精度而int是32位。long转floatlong转double精度丢失原理是一样 详解 我们知道float的存储结构是1个符号位8个指数位23个尾数。 符号位表述浮点数的正或者负0代表正1代表负。指数位实际也是有正负的但是没有单独的符号位在计算机的世界里进位都是二进制的指数表示的也是2的N次幂8位指数表达的范围是0到255而对应的实际的指数是127到128。也就是说实际的指数等于指数位表示的数值减127。尾数位只代表了二进制的小数点后的部分小数点前的那位被省略了当指数位全部为0时省略的是0否则省略的是1。 所以可以说实际上尾数确定了浮点数的精度而数的大小主要是靠指数位尾数只有23位加上隐含的一位整数位便是24位。也就是说int类型的值在2^24以内float是可以精确表示的但是当超过这个数的时候就不一定能精确表示了。其他类型也是如此。 取值范围 1、int。 最小值Integer.MIN_VALUE -2147483648 -2的31次方最大值Integer.MAX_VALUE 2147483647 2的31次方-1 2、double。 最小值Double.MIN_VALUE4.9E-324 2的-1074次方最大值Double.MAX_VALUE1.7976931348623157E308 2的1024次方-1负值取值范围为: -1.7976E308 到 -4.94065645841246544E-324正值取值范围为: 4.94065645841246544E-324 到 1.797693E308 e308表示乘以10的308次方而e-324 表示乘以10的负324次方float有效数字8位double有效数字16位 3、long。 最小值Long.MIN_VALUE-9223372036854775808 -2的63次方最大值Long.MAX_VALUE9223372036854775807 2的63次方-1 4、float 。 最小值Float.MIN_VALUE1.4E-45 2的-149次方最大值Float.MAX_VALUE3.4028235E38 2的128次方-1 e38 表示乘以10的38次方而e-45 表示乘以10的负45次方 System.out.println(Long.MAX_VALUE: --- Long.MAX_VALUE);
System.out.println(Double.MAX_VALUE: --- new Double(Double.MAX_VALUE).longValue());
System.out.println(Double.MAX_VALUE: --- new Double(1.797693e308).longValue());// 打印结果
Long.MAX_VALUE: --- 9223372036854775807
Double.MAX_VALUE: --- 9223372036854775807
Double.MAX_VALUE: ---9223372036854775807 二、 Java数据类型及转换原则
赋值和方法调用转换规则从低位类型到高位类型自动转换从高位类型到低位类型需要强制类型转换 1布尔型和其它基本数据类型之间不能相互转换 2byte型可以转换为short、int、、long、float和double 3short可转换为int、long、float和double 4char可转换为int、long、float和double 5int可转换为long、float和double 6long可转换为float和double 7float可转换为double 其中int转换为char类型float类型都需要强转会导致精度丢失 long转换为double也需要强转会导致精度丢失。 三、打印数值 char类型的最大值:127 char类型的最小值:-128signed char类型的最大值:127 signed char类型的最小值:-128 unsigned char类型的最大值:255 short类型的最大值:32767 short类型的最小值:-32768 unsigned short类型的最大值:65535 int类型的最大值:2147483647 int类型的最小值:-2147483648 unsigned int类型的最大值:4294967295 long类型的最大值:2147483647 long类型的最小值:-2147483648 unsigned long类型的最小值:4294967295 float类型的尾数位数:24 float类型的最小有效数字位数:6 带有全部有效数字位数的float类型的负指数的最小值:38 带有全部有效数字位数的float类型的正指数的最大值:-37 保留全部精度的float类型正数的最小值:1.175494e-038 保留全部精度的float类型正数的最大值:3.402823e038 1.00和比1.00大的最小的float类型值之间的差值:1.192093e-007 double类型的尾数位数:53 double类型的最小有效数字位数:15 带有全部有效数字位数的double类型的负指数的最小值:308 带有全部有效数字位数的double类型的正指数的最大值:-307 保留全部精度的double类型正数的最小值:2.225074e-308 保留全部精度的double类型正数的最小值:1.797693e308 1.00和比1.00大的最小的double类型值之间的差值:2.220446e-016 long double类型的尾数位数:64 long double类型的最小有效数字位数:18 带有全部有效数字位数的long double类型的负指数的最大值:4932 带有全部有效数字位数的long double类型的正指数的最小值:-4931 保留全部精度的long double类型正数的最小值:3.205284e-317 保留全部精度的long double类型正数的最大值:3.205284e-317 1.00和比1.00大的最小的long double类型值之间的差值:3.205284e-317