java数据类型的转换以及精度丢失

news2024/12/28 19:41:46

java数据类型的转换以及精度丢失_long转double会丢失精度吗_ღLiJia的博客-CSDN博客

一.浮点类型在计算机当中的存储 

在这里插入图片描述

  • float存储需求是4字节(32位), 其中1位最高位是符号位,中间8位表示阶位,后32位表示值
    • float的范围: -2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38
    • float的精度: 2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字
  • double存储需求是8字节(64为),其中1位最高位是符号位,中间11位表示阶位,后52位表示值
    • 取值范围: -2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308 
    • 精度: 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转float,long转double都会发生精度丢失。精度丢失包括两种,一是有效数字丢失,一是目标类型完全无法表示数据

原因如下:

int和float都是32位,但是内存结构也就是存储结构是不一样的,float只有24(含隐含的一位整数位)位来确定精度,而int是32位。long转float,long转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_VALUE=4.9E-324 (2的-1074次方)
  • 最大值:Double.MAX_VALUE=1.7976931348623157E308 (2的1024次方-1)
  • 负值取值范围为:  -1.7976E+308 到 -4.94065645841246544E-324,
  • 正值取值范围为: 4.94065645841246544E-324 到 1.797693E+308
    • (e+308表示乘以10的308次方,而e-324 表示乘以10的负324次方)
  • float有效数字8位,double有效数字16位

3、long。

  • 最小值:Long.MIN_VALUE=-9223372036854775808 (-2的63次方)
  • 最大值:Long.MAX_VALUE=9223372036854775807 (2的63次方-1)

4、float 。

  • 最小值:Float.MIN_VALUE=1.4E-45 (2的-149次方)
  • 最大值:Float.MAX_VALUE=3.4028235E38 (2的128次方-1)
    • ​​​​​​​​​​​​​​(e+38 表示乘以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.797693e+308).longValue());

// 打印结果
Long.MAX_VALUE: ---> 9223372036854775807
Double.MAX_VALUE: ---> 9223372036854775807
Double.MAX_VALUE: --->9223372036854775807

 ​​​​​​​​​​​二、 Java数据类型及转换原则

赋值和方法调用转换规则:从低位类型到高位类型自动转换,从高位类型到低位类型需要强制类型转换:

  (1)布尔型和其它基本数据类型之间不能相互转换;
  (2)byte型可以转换为short、int、、long、float和double;
  (3)short可转换为int、long、float和double;
  (4)char可转换为int、long、float和double;
  (5)int可转换为long、float和double;
  (6)long可转换为float和double;
  (7)float可转换为double;

  其中,int转换为char类型,float类型都需要强转,会导致精度丢失
   long转换为double也需要强转,会导致精度丢失

 三、打印数值

char类型的最大值:127
char类型的最小值:-128
signed 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.402823e+038
1.00和比1.00大的最小的float类型值之间的差值:1.192093e-007

double类型的尾数位数:53
double类型的最小有效数字位数:15
带有全部有效数字位数的double类型的负指数的最小值:308
带有全部有效数字位数的double类型的正指数的最大值:-307
保留全部精度的double类型正数的最小值:2.225074e-308
保留全部精度的double类型正数的最小值:1.797693e+308
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/442791.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搞懂哈希散列

文章目录 1. 哈希概念2. 如何解决哈希冲突?3. 哈希函数概念4. 闭散列(目前淘汰的方法,了解)**4.1.线性探测****4.2. 二次探测**4.3 闭散列查找与删除 5. 开散列6. 开散列与闭散列比较 1. 哈希概念 搜索树需要多次的关键码比较来搜索到结果&a…

AutoGPT、AgentGPT、BabyAGI、HuggingGPT、CAMEL:各种基于GPT-4自治系统总结

ChatGPT和LLM技术的出现使得这些最先进的语言模型席卷了世界,不仅是AI的开发人员,爱好者和一些组织也在研究探索集成和构建这些模型的创新方法。各种平台如雨后春笋般涌现,集成并促进新应用程序的开发。 AutoGPT的火爆让我们看到越来越多的自…

Linux 3.14的设备树-实战开发代码

OF提供的函数主要集中在drivers/of/目录下,有address.c,base.c,device.c,fdt.c,irq.c,platform.c等等 1,根据deice_node结构的full_name参数,在全局链表of_allnodes中,查找合适的device_node struct device_node *of_find_node_by…

概率/期望dp

思维方式 概率/期望dp都是分析从当前状态能否去到其他情况,然后进行期望/概率公式的运算,最后消元推导出一般式。 ​​​​​​Problem - 4089 (hdu.edu.cn) 思路:概率dp,正推 分类讨论,设dp[i][j]表示i人的队伍在…

力扣sql中等篇练习(八)

力扣sql中等篇练习(八) 1 确认率 1.1 题目内容 1.1.1 基本题目信息1 1.1.2 基本题目信息2 1.1.3 示例输入输出 a 示例输入 b 示例输出 1.2 示例sql语句 # 分别统计没确认的用户和已经确认了的用户 SELECT s.user_id,ROUND(SUM(IF(c.actionconfirmed,1,0))/count(*),2) co…

GPT模型支持下的Python-GEE遥感云大数据分析、管理与可视化技术及多领域案例应用

如今,Earth Engine凭借其强大的功能正受到越来越多国内外科技工作者的关注,应用范围也在不断扩大。学习致力于帮助科研工作者掌握Earth Engine的实际应用能力,以Python编程语言为基础,结合实例讲解平台搭建、影像数据分析、经典应…

JAVA开发(H5商城嵌套到第三方H5商城进行异业合作方案)

需求背景: 很多电商网站或者说是购物网站都是H5商城的方式,每个公司都有自己的H5商城。当公司和公司之间进行异业合作,商城互相导流甚至商城聚合时就需要H5商城和H5商城的嵌套和对接。假如存在A商城和B商城,现在需要B商城入驻到A商…

CrackMapExec 域渗透工具使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、CrackMapExec 是什么?二、简单使用1、获取帮助信息2、smb连接执行命令3、使用winrm执行命令(躲避杀软)4、smb 协议常用枚…

Binder 驱动结构体列表

下面列举 Binder 驱动相关的一些重要结构体 6~9 用于数据传输相关,其中 binder_write_read,binder_transaction_data进程空间和内核空间是通用的。 BWR 核心数据图表 binder_write_read 是整个 Binder IPC 过程,最为核心的数据结构之一 3.…

品牌推广:如何让品牌在市场中保持活力并吸引更多的年轻人?

在如今这个竞争激烈的市场环境中,让品牌年轻化已经成为了许多企业追求的目标。随着社会的不断发展和进步,消费者的需求和心理也在不断变化。因此,如果一个品牌想要在市场中保持活力并吸引更多的年轻人,就必须思考如何让品牌年轻化…

【社区图书馆】读书推荐:《PyTorch高级机器学习实战》

读书推荐:《PyTorch高级机器学习实战》 作者:i阿极 作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏…

【GIT】git push后长时间没反应

方向一 查看是否添加ssh 打开git bash cd ~/.ssh看是否成功,能成功说明之前生成过,看文件夹下是否有id_rsa.pub和id_rsa文件,有的话跳过生成步骤3 输入 ssh-keygen -t rsa -C ‘your_emailexample.com’(注:your_emailexample.c…

人人都能GPT!微软开源DeepSpeed Chat帮用户训练模型

简介 4月12日,微软宣布开源了 DeepSpeed Chat,帮助用户加速训练类似于 ChatGPT 的模型。 DeepSpeed Chat 能够简化 ChatGPT 类型模型的训练过程、强化推理体验。其中的 DeepSpeed-RLHF 系统能够在推理和训练两种模式之间进行切换,使复杂的 …

【经典面试题目:最长递增子序列变形题目 | 动态规划 + 二分】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

StackExchange.Redis.RedisServerException 针对持有错误类型值的密钥的WRONGTYPE操作

Redis 的异常消息:StackExchange.Redis.RedisServerException:“WRONGTYPE Operation against a key holding the wrong kind of value” 最近一个较早的项目新增一些功能,业务中服务端需要在token中自动获取用户相关信息的操作,项目中已经封…

web模块_2(SQL注入,上传文件的权限获取)

1题目描述:你知道index.php的备份文件名吗? index.php的备份文件名为index.php.bak2题目描述 php中,双等号是弱类型比较。判断是否相等,不判断格式。 判断格式是否相等。“0a”0为True,“1235a"不算数字&#xf…

从原理聊JVM(一):染色标记和垃圾回收算法

作者:京东科技 康志兴 1 JVM运行时内存划分 1.1 运行时数据区域 • 方法区 属于共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。运行时常量池,属于方法区的一部分,用于存放编译期生…

spring的BeanFactory和applicationContext有什么区别?

一、加载bean时机不同 ApplicationContext是一次性立刻加载,比较消耗资源但是后续读取非常快,会将spring中所有的bean进行初始化,全部实例化到spring中!!属于饿汉模式加载。 Beanfactory是一个用来管理bean对象的工厂,加载bean的时候不会立刻一次性加载,使用的是惰性…

【C语言】分支语句和循环语句(下)

【C语言】分支语句和循环语句(下) 1.for循环1.2 语法1.3 break和continue在for循环中1.4 for语句的循环控制变量1.5 一些for循环的变种1.6一道笔试题 2. do……while()循环2.1 do语句的语法2.2 do语句的特点2.3 do while循环中的b…

Python多线程慎用shutil.make_archive打包

Python多线程慎用shutil.make_archive打包 记一下在工作中遇到一个错误,先说一下结论shutil.make_archive是线程不安全的,要慎重使用!!! 参考:https://stackoverflow.com/questions/41625702/is-shutil-mak…