No.1 整数除法得整数

这是老生常谈的话题了,也是很坑的一个点。

1 / 2 => 0

为啥?因为整数除法,得到整数,相当于应得的浮点数会被截断取整。

解决策略:先转型:

(double)1 / 2 => 0.5

No.2 运算后转型会溢出

之前在做洛谷OJ题解的时候多次提到这个问题:
比如两个int相乘再除以一个int,结果不会爆,但如果你使用int就会爆,甚至可能得到负数。
就算你用了long,也是先执行等号右边的计算,计算的类型还是int,只不过相当于先进行了运算后进行了转换。
我们要操作的话,宁可先转型后运算也不要弄颠倒了。

No.3 负数取模得负数

3 % 2 => 1
-1 % 2 => -1
-3 % 2 => -1
(-3) % 2 => -1

所以说,千万别以为负数会按照正数的规则去取模,当然,只不过互为相反数的两个数,取模结果也互为相反数。

补充,对负数取模会被认为是对其相反数取模。

取模的算法被模拟为Java代码大概是这样的(以a%b为例):

ans = a - a/b*b;

No.4 奇偶数判定不靠谱

这里有个讲究:奇偶数的判定,要用偶判断,不要用奇判断。

i % 2 == 1

上面的判断表达式就是奇判断,根据上面讲的取模的坑,我们就知道了,负数取模还是负数啊,怎么可能是正整数1呢?
所以,得到的偶数范围包含了正偶数、零和负整数。

其实,用下面的偶判断表达式更合理一些:

i % 2 == 0

(可以用位运算替换)

No.5 运算符不能算大数

大数要用 java.math.BigInteger 或者 java.math.BigDecimal ,这两个类都是非基本类型包装类的引用类型,也不是String这种特殊类型,所以用于基本运算的 + 、- 、* 、/ 就不好使了,应该使用对象的成员方法。

No.6 不要滥用++

下面是之前总结过的四篇有关++的文章,可以读读:

  • 探究自增运算符++的原理
  • a++ + ++a到底是什么
  • j=j++到底是什么
  • C语言里++能随便用吗

No.7 不会取相反数

这也不会?别说,有时候很多人还真不会……

下面的代码是一个很好的处理方案:

a = -a;

No.8 不会构造BigInteger对象

BigInteger num1 = new BigInteger(1);

上面的代码对吗?
答案是No!
BigInteger没有整数构造器参数,但可以使用String,所以可以这么写:

BigInteger num1 = new BigInteger("1");

或者

int a = 1;
BigInteger num1 = new BigInteger(Integer.toString(a));

你以为这就完了?

BigInteger类中有三个好使的静态属性:ZERO、ONE、TWO(TWO早期兼不兼容我不知道,但我知道洛谷OJ的Java8交上去TWO会CE)

注意静态导入(不好)或者自行使用,但却是减免了自己构造0、1、2的麻烦。

No.9 不会读大数

BigInteger num1 = new BigInteger(scanner.next());
BigDecimal num2 = new BigDecimal(scanner.nextDouble());

这是比较聪明的,其实大可不必。
Scanner慢归慢,能力很强的,自然可以直接生成BigInteger和BigDecimal:

BigInteger num1 = scanner.nextBigInteger();
BigDecimal num2 = scanner.nextBigDecimal();

这不就省事了?

No.10 不熟悉各个基本类型的范围

别笑话,有时候真的让人迷惑。
再有一说是,Java缺几个东西:long double(真没有)、long long(实际上在Java里是long)、无符号数……

推荐阅读

未完待续

后续有想到新的东西会继续补充分享的!

【Java】数值计算排雷指南相关推荐

  1. Java面试参考指南(二)

    2019独角兽企业重金招聘Python工程师标准>>> 访问修饰符 对于基本的OOPS(面向对象)概念,请看Java面试参考指南的第一部分.访问修饰符规定了一个类如何访问另一个类及它 ...

  2. Java性能优化指南,及唯品会的实战

    来了唯品会一年多,不少时间花在与服务化框架.业务应用的性能的缠斗上. 前几天正好趁着中生代社区的十月十城技术沙龙,把脑海中关于性能优化的记忆全部理了一遍-.讲完回家,又本着认真严谨的态度再理了一遍,终 ...

  3. sqoop2 java api实现_Sqoop2 Java客户端API指南

    原文连接:http://sqoop.apache.org/docs/1.99.6/ClientAPI.html Sqoop Java客户端API指南 这篇文章秒描述了额如何在外部应用中使用sqoop ...

  4. Java Calendar使用指南

    Java Calendar使用指南 @(JAVA)[java] 完整代码请见:https://github.com/lujinhong/lujinhong-commons/tree/master/lu ...

  5. java jsp学习指南_JSP教程–最终指南

    java jsp学习指南 编者注: JavaServer Pages(JSP)技术使您可以轻松创建同时包含静态和动态组件的Web内容. JSP技术提供了Java Servlet技术的所有动态功能,但提 ...

  6. Java 9迁移指南:七个最常见的挑战

    我确定您已经听说过更新到Java 9并不是一件容易的事,甚至可能是不兼容的更新,而且对于大型代码库而言,迁移毫无意义. 这样做之后,我迁移了一个相当大的旧代码库,我可以告诉你,这还不错. 比碰到Jav ...

  7. Java面试参考指南–第1部分

    JAVA面向对象的概念 Java基于面向对象的概念,它允许更高级别的抽象以实际方式解决任何问题. 面向对象的方法将实际对象中的问题解决方案概念化,从而更易于在整个应用程序中重用. 例如椅子,风扇,狗, ...

  8. Java Gradle入门指南之依赖管理(添加依赖、仓库、版本冲突)

    Java Gradle入门指南之依赖管理(添加依赖.仓库.版本冲突) 作者:@gzdaijie 本文为作者原创,转载请注明出处:http://www.cnblogs.com/gzdaijie/p/52 ...

  9. Java工程师学习指南 中级篇

    Java工程师学习指南 中级篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我写的文章都是站 ...

最新文章

  1. C库函数-perror()
  2. 【相关性搜索】 多字段搜索的两种方式——词中心与字段中心
  3. strconv---用来基本类型之间的转换
  4. 机器学习入门——分类算法的评价
  5. 【Oracle】等待事件详细内容
  6. 存储过程适用于你吗?
  7. 软件测试工作的基本流程是什么
  8. 2023年四川农业大学农村发展专硕经验贴
  9. Appium+python自动化(四十一)-Appium自动化测试框架综合实践 - 即将落下帷幕(超详解)
  10. 2022-2028年中国医用纺织品行业市场发展潜力及投资风险预测报告
  11. 基于vue开发的多条件联动筛选特效(类似京东/淘宝/中国移动)
  12. BERTILO发“富”啦,来元代艺数get你的专属「招财兔」!
  13. 谷歌施密特:中国人相当出色2025年将超美国成AI主导丨业界大佬财报频出【软件网每日新闻播报│第11-3期】
  14. C语言经典例题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,两年内每个月的兔子总数为多少?
  15. 机器学习之数据的偏态分布
  16. “帽子戏法”从何而来?
  17. Spring核心编程思想
  18. 十条服务器端优化Web性能的技巧
  19. (指针处理)有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。
  20. appium python 打开通知栏_appium+python 操作APP

热门文章

  1. 2.1 linux C 进程与多线程入门--(1)进程和程序的区别
  2. vscode格式化关于符合eslint检测语法配置
  3. C#学习之向量运算符重载
  4. iptables学习(2)
  5. [程序员必备工具]分享一款不错的个人代码个人知识管理软件wiz
  6. 极大似然估计的渐进正态性
  7. 洛谷 P3367 ---- 【模板】并查集
  8. 这个故事告诉你,拥有吃不胖的超能力就无忧无虑
  9. rfcv函数实现_OpenSSL AES_ctr128_encrypt()作为伪随机函数在RFC3711(SRTP)
  10. java swarm集群_52个Java程序员不可或缺的 Docker 工具