目录

前言

一、运算规则

1、不同类型运算

1.1、案例1(不同类型进行运算,结果与最大数据类型一致)

总结

1.2、案例2(不同类型进行运算,强转结果使其与接收的数据类型一致)

总结

1.3、案例3(加减乘除)

2、运算时的类型变化

2.1、案例1(byte)

2.2、案例2(short)

2.3、案例3(char)

3、整数运算溢出

3.1、案例1

4、浮点数运算不精确

4.1、案例1

4.2、案例2

5、浮点数的特殊值

5.1、案例1


前言

前面笔者带着大家对《基本数据类型》有了了解,也对《基本数据类型之间的转换以及字面值》进行了整理概括,那我们了解了这些要干什么呢?它会运用在哪里呢?感觉有很多人有这个疑问吧。今天笔者带大家来学习一下《运算规则》。


一、运算规则

我们在写任何程序的时候,都少不了计算,加也好减也罢。他都是有一些规范的,接下来笔者带大家一起来认识一下Java的5条运算规则。


1、不同类型运算

在不同数据类型进行运算时,计算结果的数据类型,与最大的一致。

1.1、案例1(不同类型进行运算,结果与最大数据类型一致)

首先我们创建两个不同整数类型的变量

public static void main(String[] args) {int x = 10; //int类型是4字节的long y = 3L; //long类型是8字节的
}

随后我们思考一个问题,如果x与y相加。我们需要以什么数据类型来接收呢?

此时呢我感觉各位应该会想到两个数据类型(int/long),那我们根据情况都来看一下:

1)如果我们使用int来接收

int count = x + y;

上图可以看出,如果我们以int来接收就会出现报错“Type mismatch: cannot convert from long to int”,说的是“类型不匹配:无法从long转换为int”也就是说我们不能使用int来接收他们相加的和

2)使用long来接收

long count = x + y;

可以看到,使用long来接受x与y的和是可以正常进行计算的。

总结:

通过上面的验证,我们可以看到如果我们对两个不同类型的变量进行运算时,它默认得到的结果会与最大的数据类型一致。当然如果我们想以小的数据类型来接收,也不是不可以,这里就需要了解“强转”


1.2、案例2(不同类型进行运算,强转结果使其与接收的数据类型一致)

还是以刚刚的两个变量为例:

int x = 10; //int类型是4字节的
long y = 3L; //long类型是8字节的

我们使用强转,将结果(long类型),转换成我们接收的int类型

public static void main(String[] args) {int x = 10; //int类型是4字节的long y = 3L; //long类型是8字节的//使用强转,将结果(long类型),转换成我们接收的int类型int count = (int)(x + y);//打印结果查看System.out.println("x+y="+count);//打印结果为:x+y=13
}

可以看到,我们使用强转后,将本是long类型的结果转换成了int类型,成功并交给了我们int 类型的 count来接收。

总结

如果我们对两个不同类型的变量进行运算时,它默认得到的结果会与最大的数据类型一致。但是当我们使用强转后,就可以将原本是long类型的结果值,转换成了int。并成功接收打印。


1.3、案例3(加减乘除)

上面其实我们已经做过加法的运算了,但是是整数与整数之间的,这里我就以整数与小数之间进行演示了。

public static void main(String[] args) {int x = 10; //int数据类型是4字节double y = 10.6; //double数据类型是8字节
}

1)相加

结果会根据运算的最大数据类型一致,所以我们需要使用double来接收

//1.相加
double count = x+y; //刚才我们说过,如果两个数进行运算,结果会根据运算的最大数据类型一致,所以我们需要使用double来接收
System.out.println(count); //打印结果为:20.6

大家想一想,如果这里我们使用强转接收会怎么样?

int count1 = (int)(x+y);//如果我们强转它的数据类型,大家想一下
System.out.println(count1);//打印结果为:20,他将后面的0.6直接舍弃了

通过实验其实我们可以看到,他将结果后的小数位直接舍弃掉了

2)相减

修改刚刚定义的变量,并进行减法运算

x = 10; //int数据类型是4字节
y = 3.6; //double数据类型是8字节//2.相减
double reduce = x-y; //刚才我们说过,如果两个数进行运算,结果会根据运算的最大数据类型一致,所以我们需要使用double来接收
System.out.println(reduce); //打印结果为:6.4//2.1.int接收相减的值
int reduce1 = (int)(x-y);//这里我们需要强转
System.out.println(reduce1);//打印结果为:6,他将后面的0.4直接舍弃了

3)相乘

x = 10; //int数据类型是4字节
y = 3.6; //double数据类型是8字节//3.相乘
double ride = x*y; //刚才我们说过,如果两个数进行运算,结果会根据运算的最大数据类型一致,所以我们需要使用double来接收
System.out.println(ride); //打印结果为:36.0//3.1.int接收相乘的值
int ride1 = (int)(x*y);//使用强转接收
System.out.println(ride1);//打印结果为:36,小数位直接舍弃了

4)相除

x = 21; //int数据类型是4字节
y = 5; //double数据类型是8字节//4.相除
double except = x/y; //刚才我们说过,如果两个数进行运算,结果会根据运算的最大数据类型一致,所以我们需要使用double来接收
System.out.println(except); //打印结果为:4.2//4.1.int接收相除的值
int except1 = (int)(x/y);//使用强转接收
System.out.println(except1);//打印结果为:4,小数位直接舍弃了

2、运算时的类型变化

byte、short、char三种比int小的整数,运算时会先自动转换成int

2.1、案例一(byte)

public static void main(String[] args) {/*** 0.验证byte在运算时会先自动转换成int*///1.先定义两个byte类型的值byte a1=10;//10默认是int类型,但是底层自动转换bytebyte a2=3; //这里的3也是同理//2.错误运算//byte a3=a1+a2;//错误的,a1+a2的结果会自动认为是int类型,赋值给byte就会大转小//byte a3=(byte)a1+(byte)a2;//编译错误,a1和a2计算结果都是int//3.正确运算byte a3=(byte)(a1+a2);//a1+a2的计算结果再强转类型System.out.println(a3);//打印结果为:13
}

2.2、案例二(short)

short其实和byte是一样的

public static void main(String[] args) {/*** 0.验证short在运算时会先自动转换成int*///1.定义一个byte类型的变量,一个short类型的变量。这里这样定义是为了验证两种比int小的值相加是否也是按int进行运算byte b1=10;short b2=20;//2.错误示范//short b3=b1+b2;//b1和b2结果就是int//3.正确示范short b3=(short)(b1+b2);//b1+b2的计算结果再强转类型System.out.println(b3);//打印结果为:30
}

2.3、案例三(char)

public static void main(String[] args) {/*** 0.验证char在运算时会先自动转换成int*///1.我们定义一个char类型的变量,看其是否可以和int相加char c1='中';//'中'的ASCII码是:20013int c2=c1+1; //使c1加1,我们发现却没有报错,证明我们的猜想是正确的,在运算是char类型的变量.默认是int类型System.out.println(c2);//打印结果为:20014 c1+1得到的结果//2.如果想使用char进行接收需要怎样操作呢//2.1.错误示范//char c3=c1+5;//c1+5也是会自动当做int//2.2.正确示范char c3=(char)(c1+5);System.out.println(c3);//打印结果为:"串","串"的ASCII码正是20014
}

通过验证,我们也可以看到在byte、short、char进行运算时,会先自动转换成int然后进行运算


3、整数运算溢出

整数运算,就相似于一个时钟,每当传入值超过了类型的最大接收范围,就会重新从最小值重新开始计算。如图(我们以byte的最大值和最小值为例):

没看明白没关系,可以看一下下面的案例,就搞懂了


3.1、案例1

获取byte、int、long的最大值,随后加1我们看看会发生什么。

public static void main(String[] args) {//1.bytebyte b = Byte.MAX_VALUE;//获取byte最大值System.out.println(b);//打印结果为:127//1.1.byte模拟运算溢出/* 因为整数的字面值是int,两者相加结果为最大数据类型int。* 所以我们使用byte接收时需要进行强转。*/byte b1 = (byte)(b + 1);//最大值+1System.out.println(b1); //打印结果为:-128//2.intint i = Integer.MAX_VALUE;//获取int最大值System.out.println(i);//打印结果为:2147483647//2.1.int模拟运算溢出int i1 = i + 1;//最大值+1System.out.println(i1);//打印结果为:-2147483648//3.longlong l = Long.MAX_VALUE;//获取long最大值System.out.println(l);//打印结果为:9223372036854775807//3.1.long模拟运算溢出/** 注意有的人在这可能就疑惑了,为啥这里不需要强转呢??因为整数的字面值时int类型,* int与long相加我们又是以long类型接收的,所以并不需要进行强转*/long l1 = l + 1;//最大值+1。System.out.println(l1);//打印结果为:-9223372036854775808}

4、浮点数运算不精确

由于Java有些小数无法精确的用二进制进行表示(这里请大家记住这个结论), 所以某些小数在运算时会出现不精确的情况。

注:根本原因是:十进制值通常没有完全相同的二进制表示形式;十进制数的二进制表示形式可能不精确。只能无限接近于那个值


4.1、案例1

public static void main(String[] args) {/*** 我们看一下小数之间的运算*/System.out.println(0.1+0.2);//打印结果为:0.30000000000000004。//出现了运算不精确的问题了,正常的话应该就是0.3才对System.out.println(0.2-0.1);//打印结果为:0.1。可以看到这个值是正确的System.out.println(0.6-0.5);//打印结果为:0.09999999999999998。//和上面的减法运算看来没什么区别,但是运算结果还是不精确System.out.println(0.3/0.1);//打印结果为:2.9999999999999996
}

通过上面的案例我们可以看到,小数之间在运算时会出现运算结果不精确的问题。

那有的朋友就要问了,那我们如果使用小数运算怎么办呢???

当然在Java当中针对浮点数精确运算也是提供了方法


4.2、案例2

public static void main(String[] args) {/*** 我们使用BigDecimal这个对象来解决浮点数运算不精确的问题*/BigDecimal x1=new BigDecimal("0.1");BigDecimal x2=new BigDecimal("0.2");BigDecimal x3=new BigDecimal("0.3");/** BigDecimal提供了add()方法,用于加法运算* BigDecimal提供了subtract()方法,用于减法运算* BigDecimal提供了multipy()方法,用于乘法运算* BigDecimal提供了divide()方法用于触发运算*///相加System.out.println("0.1+0.2="+x1.add(x2));//打印结果为:0.1+0.2=0.3//相减System.out.println("0.3-0.1="+x3.subtract(x1));//打印结果为:0.3-0.1=0.2//相乘System.out.println("0.1*0.03="+x1.multiply(x3));//打印结果为:0.1*0.03=0.03//相除System.out.println("0.2/0.1="+x2.divide(x1));//打印结果为:0.2/0.1=2
}

可以看到我们通过使用BigDecimal对象也是成功的解决了小数运算不精确的问题。

那有的朋友就要问了,BigDecimal是什么???

BigDecimal是Java在java.math包中提供的API类,用来对超过16位有效位的数进行精确的运算。这里我们还没讲到API所以先做了解就可以!


5、浮点数的特殊值

5.1、案例1:

public static void main(String[] args) {/*** 0.浮点数的特殊值,有两种情况:*   Infinty 无穷大*   NaN -- not a Number 不是一个数字*///1.Infinty//1.1.正数除以0的结果就是正无穷大System.out.println(3.12/0);//Infinity//1.2.负数除以0的结果就是负无穷大System.out.println(-3.12/0);//-Infinity//2.NaNSystem.out.println(0.0/0.0);//NaN
}

以上就是此次笔者带来的内容了,有什么疑问或者有什么建议可以评论区告诉我,谢谢大家的支持!!!

JAVA程序入门--基础知识(运算规则)相关推荐

  1. codemix java,CodeMix入门基础知识

    CodeMix在线订购年终抄底促销!火爆开抢>> CodeMix入门 CodeMix是一个Eclipse插件,可以直接从Eclipse访问VS Code和为Code OSS构建的附加扩展的 ...

  2. java入门基础知识示例代码

    本次更新给大家带来java的入门基础知识相关学习代码 模块一:java程序里的数据书写格式 package com.jiawei.literal;public class LiteralDemo {p ...

  3. 黑马程序员 一、java 概述与基础知识

    获取更多资源关注Java帮帮IT资源分享网 一.黑马程序员-java 概述与基础知识 1.何为编程? 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果 的过程. 为了使 ...

  4. 好程序员web前端教程分享web前端入门基础知识

    好程序员web前端教程分享web前端入门基础知识,作为合格的Web前端工程师必须得掌握HTML.CSS和JavaScript.只懂其中一两个还不行,必须对这三门语言都要熟悉.下面我们一起来看一看吧! ...

  5. java 网络爬虫 正则表达式_【干货】Java网络爬虫基础知识

    原标题:[干货]Java网络爬虫基础知识 引言 Java 网络爬虫具有很好的扩展性可伸缩性,其是目前搜索引擎开发的重要组成部分.例如,著名的网络爬虫工具 Nutch 便是采用 Java 开发,该工具以 ...

  6. Windows通用克隆系统入门基础知识简介

    Windows通用克隆系统入门基础知识简介 这里的Windows是指微软的Windows 2000/XP/2003(后文中未经说明的,凡是Windows均指这三种系统):所谓的通用克隆,俗名万能克隆, ...

  7. JAVA进阶的基础知识快速通过---自学笔记(二)

    温故而知新---陆续学习陆续更新中,你有更好的记忆和学习方法,请在评论区提出来大家一起交流,认真看完,一行行代码备注看完看懂,保证学会,学不会找我. 前言: 代码学完发现很简单,很多初学者搞不明白什么 ...

  8. Spark —— 闪电般快速的统一分析引擎 —— 入门基础知识

    Spark 入门基础知识 Spark 的特点 速度快 使用方便 通用 兼容 Spark 基础 下载 独立部署模式(Standalone) 弹性分布式数据集 Scala shell 1. 数组中的最值: ...

  9. JS学习笔记——入门基础知识总结

    JS入门基础知识总结1 前言 基础背景知识 一.产生历史: 二.特点: 三.应用方向: 四.Javascript组成: JavaScript书写使用方式 一.行内式(了解即可,项目中不使用,日常练习尽 ...

最新文章

  1. 使用border-collapse:collapse;属性新建一个细线表格
  2. 字符串经典题之参数解析
  3. java的getshape(),Java RectangularShape.getMaxX方法代码示例
  4. 19 岁少年找 Bug 赚了 100 万美元
  5. chrome浏览器插件--让你的谷歌浏览器舒适度提升1800%的插件(程序员推荐)
  6. 制作chrome插件
  7. 你的IE一路顺风吗?
  8. 【技术贴】解决开机本地连接出来慢,本地连接开机后出来时间慢
  9. OOA、OOD、OOP 区别与思想
  10. 一文学会最常见的10种NLP处理技术(附资源代码)
  11. 计算机网络与Internet发展历史
  12. VMWare虚拟机序列号大全
  13. 爬虫技术:携程爬虫阳光问政数据
  14. C语言实现BC28NB模组上报数据到电信云
  15. 球重力异常matlab程序,球体重力异常正演程序介绍.docx
  16. matlab坐标轴加粗
  17. 【软件工程】求10个数最大值和平均值 以流程图、盒图、PRD图的形式画出
  18. html中可以打钩的小方块,Word文档怎么实现在小方块里打钩? | 我爱分享网
  19. 大话3G——手机大佬“摩托罗拉”兴衰史
  20. MacBook 往服务器上传、下载文件的几种操作

热门文章

  1. 总结 HTTPS 的加密流程
  2. 云呐|资产管理系统平台,固定资产平台解决方案
  3. Nashpy包学习(一)
  4. 卖软件,卖服务,卖思想?
  5. 【辣眼睛】QQ新功能-照片回收站
  6. 【秋招/春招】简历内容如何填写(1)
  7. 【苹果群发】内容Apple推送iMessage服务器和iOS手机操作系统之间的套接字连接PushNotificationDemo
  8. oracle ext3 ext4 xfs,ext4、ext3、xfs文件系统数据恢复教程
  9. 查尔姆斯理工计算机教授,瑞典查尔姆斯理工大学Jan Stake教授访问上海微系统所...
  10. 怎样从毕业生成为职业人