判断两个数是否相等,并不是那么简单的
在最近的面试中,我出了下面这样一道题目:
写一个比较两个数是否相等的函数。
这道题目简单吗?
很多人是这么写的
ActionScript Code:
- function isEqual (num1:Number, num2:Number):Boolean
- {
- if (num1 == num2)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
这段代码使用if、else语句和==操作符就行判断,基本上能满足要求。
一部分人是这么写的
ActionScript Code:
- function isEqual (num1:Number, num2:Number):Boolean
- {
- return num1 == num2;
- }
这段代码比第一段代码要简洁,效果跟第一段代码一样。
但是前面两段代码都存在Bug,可以试下
ActionScript Code:
- trace(isEqual(2.1 / 3, 0.7));
输出结果是
Output Code:
- false
原因是计算机在处理小数时存在误差,二进制不能准确的表示很多小数。
改进的做法是像下面这样
ActionScript Code:
- function isEqual (num1:Number, num2:Number):Boolean
- {
- return Math.abs (num1 - num2) < 0.000001;
- }
在现实应用中,比较两个数是否相等都有不同的额外规则,很多时候并不要求精确相等,很多情况下只要结果是在 某个范围内都应该是允许的,比如做吸附效果,只要进入某个区域就会自动附着到目标点上,所以我们应该再改进为如下
ActionScript Code:
- function isEqual (num1:Number, num2:Number, offset:Number):Boolean
- {
- if(arguments.length < 3)
- {
- offset = 0.000001;
- }
- return Math.abs (num1 - num2) < offset;
- }
这段代码允许我们设定允许的误差,如果不设定就为默认的0.000001。
我把这道题作为面试题目,就是想看下ASer的经验。其实这道题并不是很简单的。|-_-

Leave a Reply