重学Java(五):操作符-阿里云开发者社区

开发者社区> 沉默王二> 正文

重学Java(五):操作符

简介: 重学Java(五):操作符
+关注继续查看

二、double的宣言:注意精度哦!


Java的基本算术操作符包括加号(+)、减号(-)、除号(/)、乘号(*)和取余(%);它们的使用方法就好像吃一口苹果那样简单,所以不再赘述。但需要注意一点,就是精度问题,来看这样一个示例:


double m = 6;
double n = 6.4;
double o = m * n;
System.out.println("m=" + m + ",n=" + n + ",o=" + o);
// 输出:m=6.0,n=6.4,o=38.400000000000006


你猜想o的输出结果肯定是38.4,因为m是6,n是6.4,它们的乘积自然是38.4啊!但你这样的猜想就好像买了一注大乐透;根据你设定的公式,这一注大乐透中一百万都是小的;但结果是,你又成功贡献了一次奖金池。为什么o的结果是38.400000000000006?为什么会这样?究竟为什么?


答案:首先,计算机进行的是二进制运算,我们输入的十进制数字会先转换成二进制,进行运算后再转换为十进制输出。double提供了快速的运算,然而问题在于转换为二进制的时候,有些数字不能完全转换,只能无限接近于原本的值,这就导致了在后来的运算会出现不正确结果的情况。


剧透:不止是double会有精度问题,float也会有精度问题。


那么,精度问题该怎么解决呢?


BigDecimal !!!

涉及到小数运算时一定要使用BigDecimal !!!

不要使用double和float。


来看一下解决方案的代码:


BigDecimal m1 = BigDecimal.valueOf(6);
BigDecimal n1 = BigDecimal.valueOf(6.4);
BigDecimal o1 = m1.multiply(n1);
System.out.println("m1=" + m1 + ",n1=" + n1 + ",o1=" + o1);
// 输出:m1=6,n1=6.4,o1=38.4


有人说,为什么要用BigDecimal.valueOf()而不用new BigDecimal()?答案如下:


BigDecimal m2 = new BigDecimal(6);
BigDecimal n2 = new BigDecimal(6.4);
BigDecimal o2 = m2.multiply(n2);
System.out.println("m2=" + m2 + ",n2=" + n2 + ",o2=" + o2);
// 输出:m2=6,n2=6.4000000000000003552713678800500929355621337890625,o2=38.4000000000000021316282072803005576133728027343750


讲究,特别的讲究。


三、害死人的自动递增,不偿命的自动递减


记得参加工作的第二年,我的同事小二就因为把“前缀递增”写成了“后缀递增”被一顿痛骂之后拉出去祭天了。至今我还耿耿于怀,因为我也是参与者之一(当时小王准备使用p = p + 1,但我劝小王使用p++,因为自动递增更加简洁);但小二很讲义气,没有把我捅出去,我才苟且活到今日。往事不堪回首,但为了以后的Java程序员着想,我决定忍着记忆的苦涩把小二当年的那段代码记录下来:


public static void main(String[] args) {
    int p = 0;
    calculate(p);
}
public static void calculate(int p) {
    if (p < 3) {
  // 其他
  calculate(p++);
    }
}

按照以上的代码来看,这是一个死循环,calculate迭代是不会跳出的,直到程序报错。为什么会这样呢?


因为后缀递增会先生成值,再执行运算;也就是p++这个表达式的结果还是p。但前缀递增会先执行运算,再生成值;也就是++p这个表达式的结果是p+1。


那以上代码正确的写法是什么呢?答案如下:


public static void main(String[] args) {
    int p = 0;
    calculate(p);
}
public static void calculate(int p) {
    if (p < 3) {
  // 其他
  calculate(++p);
    }
}


四、我俩到底等不等?


==用来判断操作符两侧的值是否相等——老生常谈的话题了;凡是遇到字符串比较,请使用equals()方法,这个大家都已经心知肚明了,不需要再强调;但对于Integer类型的值进行比较时,还需要特别强调一下;因为针对实际的项目来说,遇到数据库中字段类型为int时,Java对象与之对应的属性需要声明是Integer(注意,不是int),Integer在比较是否相等时不能使用==!为什么呢?请看以下代码:


Integer q = 127;
Integer r = 127;
System.out.println(q == r); // true
q = 128;
r = 128;
System.out.println(q == r); // false


为什么一个是true,一个是false?


因为Integer作为常量时,对于-128到127范围之间的数,Java会对其进行缓存;也就是说Integer q = 127时,Java会将其存放在缓存中,当执行Integer r = 127时,Java发现缓存中存在127这个数了,就直接取出来赋值给r,所以此时的q == r,也就是说System.out.println(q == r)此时输出true。当q和r不在-128到127之间的范围时,Java会通过new Integer()来创建该数值,所以q和r被赋值为128时q != r,也就是说System.out.println(q == r)此时输出false。


针对这个情况,在判断Integer是否相等时,尽量使用以下代码来进行判断:


System.out.println(q.intValue() == r.intValue());

System.out.println(q.compareTo(r) == 0);


注意:前提条件是q和r都不为null。


五、跳过的位移运算符


对不起,我选择跳过!


六、特别的三元操作符


来看这样一段代码:


boolean flag = true;

System.out.println(flag ? "点赞转发分享" : "踩死你丫的");


三元操作符也称为条件操作符,它很简洁,也很特别,因为它有三个操作数:


boolean-exp ? value0 : value1


?前面是布尔表达式,?后面是两个可选值(用:隔开),布尔表达式为true,则三元操作符的结果是value0,否则是value1。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
使用NAT网关轻松为单台云服务器设置多个公网IP
在应用中,有时会遇到用户询问如何使单台云服务器具备多个公网IP的问题。 具体如何操作呢,有了NAT网关这个也不是难题。
25921 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
2517 0
阿里云服务器ECS远程登录用户名密码查询方法
阿里云服务器ECS远程连接登录输入用户名和密码,阿里云没有默认密码,如果购买时没设置需要先重置实例密码,Windows用户名是administrator,Linux账号是root,阿小云来详细说下阿里云服务器远程登录连接用户名和密码查询方法
9574 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
11078 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
10595 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
8126 0
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
6075 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
20973 0
+关注
沉默王二
微信搜索「沉默王二」,回复关键字「00」获取硬核计算机基础资料。
1084
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《Nacos架构&原理》
立即下载
《看见新力量:二》电子书
立即下载
云上自动化运维(CloudOps)白皮书
立即下载