表达式之谜
2018-06-18 04:16:14来源:未知 阅读 ()
一、判断奇数
说到判断奇数,第一反应就是 i % 2 == 1;然而这个是有很大问题的;
对负数的判断而言,其语句是错误的!!因为 负数%2 == -1
所以可以改进为 i % 2 != 0;
还可以进一步优化,众所周知,位运算是特别快的,所以有: i & 1 != 0; ==> 最优方案!!!
二、找零时刻
找零钱:2-1.1 = ?
直接输出:System.out.println(2-1.1); ==> 0.8999999999999999
这是因为在计算机中并不是所有的小数都可以用二进制精确表示,
若要精确表示可因使用BigDecimal ,且,一定要用BigDecimal(String)
改进:使用printf进行输出可以实现该功能!!
System.out.printf("%.2f",2-1.1);
优化:使用BigDecimal实现:
System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.10")));
三、长整除
long / long
一天中的毫秒数 / 一天中的微秒数
final long weimiao = 24 * 60 * 60 * 1000 * 1000; final long haomiao = 24 * 60 * 60 * 1000; System.out.println(weimiao / haomiao); //5
这是由于weimiao溢出造成的,虽然计算完成的结果不溢出,但是由于在运算过程中是以int类型计算的,weimiao产生溢出,使结果出错!!!
解决方法很简单,通过long常量代替int常量作为每一个乘积的因子:
1 final long weimiao = 24L * 60 * 60 * 1000 * 1000; 2 final long haomiao = 24L * 60 * 60 * 1000; 3 4 System.out.println(weimiao / haomiao); //1000
结果正确!!
在操作很大的数字时,千万要注意溢出问题,拿不准时,就用long来计算!!
四、十六进制
System.out.println(Long.toHexString(0x100000000L + 0xcafebabe)); ==> cafebabe
!如果十六进制或八进制字面常量的最高位被置位了,则,它为负数!!!!
其中long+int ==> 自动转型为 long+long
且,第二个数符号扩展:
可将第二个数编程long类型,以避免具有破坏力的符号扩展!!
System.out.println(Long.toHexString(0x100000000L + 0xcafebabeL)); ==> 1cafebabe
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++98/11/17表达式类别 2020-05-23
- 表达式·表达式树·表达式求值 2020-04-29
- 定位new表达式与显式调用析构函数 2020-04-20
- 【图论】几个例题~ 2020-04-14
- 【题解】Luogu1739 表达式括号匹配 2020-04-07
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash