java整型和浮点型_Java基本的程序结构设计 整形和浮点型

整形:

int 4字节

short 2字节

long 8字节

byte 1字节

int的大小差不多是20亿。

整形计算

如果两个int进行加减乘除数学运算的时候,最终的结果仍然是int,有可能出现了溢出,那么结果就不是我们想要的了。如下:

System.out.println("Integer.MAX_VALUE: " + Integer.MAX_VALUE);

//两个int相加 结果仍然是int 溢出

System.out.println("Integer.MAX_VALUE - Integer.MIN_VALUE: " + (Integer.MAX_VALUE - Integer.MIN_VALUE));

//两个int相加 结果仍然是int 溢出

System.out.println("Integer.MAX_VALUE + 1 : " + (Integer.MAX_VALUE + 1));

//int + long 结果是long 没有溢出

System.out.println("Integer.MAX_VALUE + 1L: " + (Integer.MAX_VALUE + 1L));

//int + long 结果是long 没有溢出

System.out.println("(long)Integer.MAX_VALUE + 1: " + ((long)Integer.MAX_VALUE + 1));

输出:

Integer.MAX_VALUE: 2147483647

Integer.MAX_VALUE - Integer.MIN_VALUE: -1

Integer.MAX_VALUE + 1 : -2147483648

Integer.MAX_VALUE + 1L: 2147483648

(long)Integer.MAX_VALUE + 1: 2147483648

当然,long相加也有这种情况。

两个int进行除法运算,得到的结果是int,不是四舍五入,而是直接截断。其他整形也是一样。

int除法,如果除数是0,那么将会报java.lang.ArithmeticException错误。其他整形也是一样。

long后缀L。

16进制:前缀0x

8进制:前缀0

尽量不要使用8进制。

java没有任何无符号类型。unsigned type。

浮点型:

float:4字节

double:8字节

关于浮点数:

浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学计数法。

一个浮点数a由两个数m和e来表示:a = m × b^e。在任意一个这样的系统中,我们选择一个基数b(记数系统的基)和精度p(即使用多少位来存储)。m(即尾数)是形如±d.ddd...ddd的p位数(每一位是一个介于0到b-1之间的整数,包括0和b-1)。如果m的第一位是非0整数,m称作规格化的。有一些描述使用一个单独的符号位(s 代表+或者-)来表示正负,这样m必须是正的。e是指数。

结构

由此可以看出,在计算机中表示一个浮点数,其结构如下:

阶码部分(定点整数)

int是精确的,一个n位的精确存储只能存储2的n次方,因为有正负和0,所以int的取值范围是负2的n次方到2的n次方-1。

float的取值范围是3.4028235E38,有效数字6-7位,以F结尾,double的取值范围是1.7976931348623157E308,有效数字15位,以D结尾。

float是不精确的,所以有有效数字的概念,如float有32位,其实是和int是一样的。int的最大值是2147483647,从十进制来讲,只有10位,float的位数中,一部分要用来定义阶码部分,留给表示位数部分的位数就减少了,划算成10进制,那么能存储的有效数字也就6-7位。如果超过有效位数,那么就不精确了。如123456789123456789和123456789120000000用float来存储,在其实都是123456789120000000f,也就是说超过6-7位精度的部分丢失了。如下:

System.out.println(123456789123456789f);

System.out.println(123456789120000000f);

结果:

1.23456791E17

1.23456791E17

具体分析,来自网上:

一个float4字节32位,分为三部分:符号位,指数位,尾数位。

(1).符号位(S):最高位(31位)为符号位,表示整个浮点数的正负,0为正,1为负;

(2).指数位(E):23-30位共8位为指数位,这里指数的底数规定为2(取值范围:0~255)。这一部分的最终结果格式为:2E−127,即范围-127~128。另外,标准中,还规定了,当指数位8位全0或全1的时候,浮点数为非正规形式(这个时候尾数不一样了),所以指数位真正范围为:-126~127。

(3).尾数位(M):0-22位共23位为尾数位,表示小数部分的尾数,即形式为1.M或0.M,至于什么时候是1,什么时候是0,则由指数和尾数共同决定。 小数部分最高有效位是1的数被称为正规(规格化)形式。小数部分最高有效位是0的数被称为非正规(非规格化)形式,其他情况是特殊值。 最终float的值 = (−1)S∗(2E−127)∗(1.M)。

float的尾数:23位,其范围为:0~223,而223=8388608=106.92,所以float的精度为6~7位,能保证6位为绝对精确,7位一般也是正确的,8位就不一定了(但不是说8位就绝对不对了),注意这里的6~7位是有效小数位(大的数你先需要转换成小数的指数形式,例如:8317637.5,其有效小数位:8.3176375E6,七位),而有效位(从第一个不为0的开始数)是7~8位,是包括整数位的,像8317637.5,你不转换,则要从有效位的角度来看,有8位有效位。

因为float只有6-7位有效数字,假如说咱们考虑为7位,所以平时使用的时候,应该是9999999这个大小内是有效的,大约999万,如果要有两位小数的话,那么就是99999.99,就只有10万了。

一旦超过了这个范围,就要开始损失了,损失从右侧开始的,右侧的数字慢慢变成了0.如12345678.92就变成了12345679.00。

double的精度是15位,对应所有的非精确运算一般都够了。

浮点型计算

浮点数的运算和整形差别很大,有一些特殊的逻辑。

浮点数有三种特殊的值,对于float来说有:

Float.POSITIVE_INFINITY:正无穷大

Float.NEGATIVE_INFINITY:负无穷大

Float.NaN:非数字

除数为0,结果为无穷大。

0f/0f,或者负数的平方根结果为NaN。

溢出:超过Float.MAX_VALUE太多,就变成了Float.POSITIVE_INFINITY,小于Float.MIN_VALUE太多,就变成了Float.NEGATIVE_INFINITY。这里说太多,是因为溢出不太多的话,float是识别不到的,得到的结果还是Float.MAX_VALUE。如下:

package com.zjf;

public class Test {

public static void main(String[] args) {

System.out.println(Float.MAX_VALUE);

System.out.println(Float.MAX_VALUE + 10000);

System.out.println(Float.MAX_VALUE * 2);

System.out.println((double)Float.MAX_VALUE * 2);

System.out.println(Float.MAX_VALUE * 2D);

System.out.println(Float.POSITIVE_INFINITY);

System.out.println(Float.NEGATIVE_INFINITY);

System.out.println(0f/0f);

System.out.println(10f/0f);

}

}

结果如下:

3.4028235E38

3.4028235E38

Infinity

6.805646932770577E38

6.805646932770577E38

Infinity

-Infinity

NaN

Infinity

boolean类型

java的布尔值和整型值之间不能做转换。也就是说0不代表false。这点和c++不一样,和JavaScript也不一样。

运算符

+ - * / %(求余)

在进行这些操作的时候,两个都是整形的话代表整数操作,结果也是整数,否是是浮点数。

ps:可移植性是java语言的设计目标之一。但是java的浮点运算在不同的处理器上的的结算结果是有差别的(特别是intel和非intel处理器之间的差别)。

java的逻辑运算符&&和||是按照"短路"方式求值的。

强制转换

整数可以强制装换为浮点数,但是可能会损失精度,但是在有效数字范围内的部分还是准确的。

浮点数可以强制装换为整数,是采用的直接截断的方式。不是四舍五入。

浮点数可以强制装换为整数,如果超过了整数的取值范围,那么结果是不可预知的。

package com.zjf;

public class Test {

public static void main(String[] args) {

float f = 1234567891234.23F;

int i = (int)f;

long l = (long)f;

System.out.println(i);

System.out.println(l);

}

}

结果:

2147483647

1234567954432

事实上,不只是浮点型和整形的转换,java中数值的转换,如果转换的结果超过了接收方的取值范围,就可能得到一个完全不同的值。

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

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

相关文章

盒子模型阴影设置,爱奇艺阴影配置

box-shadow的配置阴影 ul li:hover{ border-color: #dfdfdf; border-radius: 10px; -moz-box-shadow: 0 5px 5px rgba(0, 0, 0, 0.1), 0 0 10px 0 rgba(0, 0, 0, 0.2); -webkit-box-shadow: 0 5px 5px rgba(0, 0, 0, 0.1), 0 0 10px 0 rgba(0, 0, 0, 0.2); box-shadow: 0 5px 5…

Linux在线扫描热添加的SCSI/iSCSI设备

SCSI接口具有应用范围广、多任务、带宽大、CPU占用率低,以及热插拔等优点,在服务器中广泛的应用。 当然在虚拟化平台支持下,也能模拟出SCSI设备,方便在虚拟机上热添加SCSI设备(一般是硬盘) 但是在热添加SCS…

第四周PSP

1.本周PSP 2.本周进度条 3.本周累计进度图 代码积累折线图 博文字数积累折线图 4.本周PSP饼状图 转载于:https://www.cnblogs.com/yuanyue-nenu/p/7648565.html

适用于JDeveloper 11gR2的Glassfish插件

众所周知, ADF Essentials是使用Java构建Web应用程序的绝佳框架,它可以自由开发和部署。 您可以在Glassfish(3.1)服务器上部署ADF Essentials应用程序。 但是,JDeveloper并不带有嵌入式Glassfish服务器,而是…

java 李刚 pdf_Java数据库技术详解(李刚) PDF_源雷技术空间

资源名称:Java数据库技术详解(李刚) PDF第一篇 数据库基础篇第1章 Java和数据库 21.1 Java概述 21.1.1 跨平台性 21.1.2 面向对象 21.1.3 安全性 31.1.4 简单性 31.1.5 健壮性和自动内存管理 31.2 Java的开发和运行环境 31.2.1 JDK的安装 31.2.2 配置JDK的环境变量 …

html css3模拟心的跳动

<!DOCTYPE html> <html> <head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><title>模拟心的跳动</title> </head> <style type"text/css">* {m…

-------------------前端技术文章收集-------------------

十个最常见的lodash方法 十个必备的js工具函数 (英文原文) You dont need 系列 underscore常用方法 (长期更新) 转载于:https://www.cnblogs.com/skura23/p/7649405.html

bzoj4152: [AMPPZ2014]The Captain

水。。。 这个建边排序一下从一边连向一边 dij在这种稀疏图果然不够优秀啊。只是学了一发。 #include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> usin…

使用Hibernate的JPA 2.0标准查询

JPA 2.0中引入了条件查询 。 借助条件查询&#xff0c;您可以以类型安全的方式编写查询。 在进行标准查询之前&#xff0c;开发人员必须通过构建基于对象的查询定义来编写查询。 构建查询时&#xff0c;可能会出现语法错误的情况。 条件查询API提供了创建具有编译时安全性的结构…

response对象的使用

使用response对象提供的sendRedirect()方法可以将网页重定向到另一个页面。重定向操作支持将地址重定向到不同的主机上&#xff0c;这一点与转发是不同的。在客户端浏览器上将会得到跳转地址&#xff0c;并重新发送请求链接。用户可以从浏览器的地址栏中看到跳转后的地址。进行…

java 菜单 分隔符_在Java中使用分隔符连接值列表最优雅的方法是什么?

我从来没有找到一个整洁(呃)的方式来做以下事情.说我有一个列表/数组的字符串.abcdefghijkl我想将它们连接成一个由逗号分隔的单个字符串,如下所示&#xff1a;abc,def,ghi,jkl在Java中,如果我这样写(原谅语法),String[] list new String[] {"abc","def",…

thinkphp3.2----实现伪静态和路由配置

URL模式&#xff1a; 0.普通 http://localhost/qixin/ThinkCMF(test)_backup/index.php?guser&mlogin&aindex    带有&#xff1f;号这种传参路径&#xff0c;对SEO不友好 1.pathinfo http://localhost/qixin/ThinkCMF(test)_backup/index.php/user/login/ind…

Cmder - 在右键菜单添加Cmder Here

使用命令行或终端工具的时候都有一个让我们觉得麻烦的问题&#xff0c;就是需要cd很多目录达到目标位置。在可视化操作系统下面我们一般都是已经处在目标目录了&#xff0c;这时需要执行某些命令如&#xff1a; python test.py   现在只需要右键点击"Cmder Here"即…

标题:a 和 a的区别

以前我也是老搞不懂a 和 a的区别, 后来看了很多资料, 终于总结出来一条规律, 小白专用! 看完这个例子就懂了: 例1:$a 8, 求 a a - --a a-- a得多少? 旧值: 8 9 10 9 8 a a - --a a-- a 新值: 9 …

Java EE CDI处理程序方法示例

这是CDI Disposer方法的教程。 在CDI中&#xff0c;由于Producer方法生成的对象随后可以注入到应用程序中&#xff0c;因此使用Disposer方法&#xff0c;以便在其工作完成时将其删除。 Disposer方法始终与Producer方法匹配。 Disposer方法的使用示例是应用程序使用与数据库的连…

转 如何更改linux文件的拥有者及用户组(chown和chgrp)

本文整理自&#xff1a; http://blog.163.com/yanenshun126/blog/static/128388169201203011157308/http://ydlmlh.iteye.com/blog/1435157一、基本知识在Linux中&#xff0c;创建一个文件时&#xff0c;该文件的拥有者都是创建该文件的用户。该文件用户可以修改该文件的拥有者…

微信小程序开发工具最新版本已更新下载(1.02.1804120)

下载地址&#xff1a;windows 64 、 windows 32 、 mac本次更新修复信息如下&#xff1a;1、修复 1.02.1804080 引入的编译条件为分包内页面时无法加载的问题 1. 更新到最新版本后 &#xff0c;编译模式中创建新的直接编译分包(/subpage/a)入口的页面&#xff0c;页面显示白屏无…

Gradle的好处:运行单个测试

我们可以使用Java插件添加的test任务&#xff0c;使用Gradle运行测试代码。 默认情况下&#xff0c;将执行项目中找到的所有测试。 如果要运行单个测试&#xff0c;则可以使用Java系统属性test.single和测试名称。 实际上&#xff0c;系统属性的模式是taskName .single 。 task…

上下div高度动态自适应--另类处理方案

这段时间在工作中遇到一个看似较为棘手的问题。问题描述&#xff1a;查询报表页面分为上下两部分&#xff0c;上部分为条件输入区域&#xff0c;下部分为报表展示区域。客户要求做到默认满屏&#xff08;但要动态适应不同的窗体大小&#xff0c;也就是浏览器窗体用户会手动改变…

java缓冲输入流_java _io_字符缓冲流的输入、输出

新增方法:输入:BufferedReader breadernew BufferedReader(Reader reader);.readLine()读取一行内容&#xff0c;返回字符串输出:BufferedWriter bwriternew BufferedWirter(Writer writer);.newLine() 写入一个换行符输入:File f new File("C:\Users\10853\eclipse-works…