[Java]循环步长不要设置成小数
2016-03-30 14:54
281 查看
摘要: 循环的步长不能是小数,可能我这里说的比较绝对了,但是最好最好不要用小数。
不然只要max足够大,循环次数必定会出问题!!!
昨天写了段逻辑很简单的代码,就是想模拟一下进度,但是这个进度是带小数的,而且只保留一位,每次小数跳0.1的时候,就打印一下curr的值。
代码如下:
但是结果究竟会是怎样的呢???运行结果如下,这里我只截取了最后一点:
![](http://static.oschina.net/uploads/space/2016/0329/231338_Otra_2658298.png)
很多人应该就会纳闷了,为什么没带=,循环还是会多跑一次???
本人菜鸟一个,也没能闹明白是为什么......但是最后总结出一个经验:
就是循环的步长不能是小数,如果是小数,那么只要给的max足够大,循环次数必定会出问题。
那么如何让自己的“进度”带有小数呢?
本人的解决方法是这样的:
将max,和步长都放大 10 倍,转成 int 类型之后在进行循环操作,然后在要显示值的时候,再缩小10倍,并格式化成一位小数。
如下代码:
这里要注意缩小10倍的时候,10后面要带 f,表示这个10是float类型的,否则会被默认成 int 类型进行计算,也就不会带有小数效果了,当然,用format格式化的时候直接就会报错了。
验证运行结果,如下喽:
不然只要max足够大,循环次数必定会出问题!!!
昨天写了段逻辑很简单的代码,就是想模拟一下进度,但是这个进度是带小数的,而且只保留一位,每次小数跳0.1的时候,就打印一下curr的值。
代码如下:
public static void main(String[] args) { float max = 50f; float curr = 0f; while (curr < max) { curr += 0.1f; System.out.println(String.format("curr = %.1f", curr)); } }
但是结果究竟会是怎样的呢???运行结果如下,这里我只截取了最后一点:
![](http://static.oschina.net/uploads/space/2016/0329/231338_Otra_2658298.png)
很多人应该就会纳闷了,为什么没带=,循环还是会多跑一次???
本人菜鸟一个,也没能闹明白是为什么......但是最后总结出一个经验:
就是循环的步长不能是小数,如果是小数,那么只要给的max足够大,循环次数必定会出问题。
那么如何让自己的“进度”带有小数呢?
本人的解决方法是这样的:
将max,和步长都放大 10 倍,转成 int 类型之后在进行循环操作,然后在要显示值的时候,再缩小10倍,并格式化成一位小数。
如下代码:
public static void main(String[] args) { int max = 500; int curr = 0; while (curr < max) { curr += 1; System.out.println(String.format("curr = %.1f", curr / 10f)); } }
这里要注意缩小10倍的时候,10后面要带 f,表示这个10是float类型的,否则会被默认成 int 类型进行计算,也就不会带有小数效果了,当然,用format格式化的时候直接就会报错了。
验证运行结果,如下喽:
![](http://static.oschina.net/uploads/space/2016/0329/233535_uUXL_2658298.png)
相关文章推荐
- Java调优之jvm和线程的内存分析
- Struts2基础学习总结
- 如何快速反编译JAVA的jar包或war包
- javaweb学习总结(十六)——JSP指令
- myeclipse卡死强在 loading workbench解决
- Java 垃圾回收
- struts2的核心和工作原理
- 关于java接口的通俗理解
- Java transient关键字使用小记
- javadoc生成出现错误【编码 GBK 的不可映射字符】
- eclipse中文字体问题
- Java基础语法
- Java transient关键字使用小记
- Java内存分配
- Java字符串转16 进制工具类Hex.java
- 搭建struts、spring、hibernate框架的简单流程
- javaweb学习总结(十五)——JSP基础语法
- struts2文件上传获取文件名、文件类型
- Java垃圾回收GC(二)
- security.js RSA 加密与java客户端解密