I Love China

技术·人生

技术服务生活
繁體
5月 29th, 2007

判断两个数是否相等,并不是那么简单的

在最近的面试中,我出了下面这样一道题目:
写一个比较两个数是否相等的函数。
这道题目简单吗?
很多人是这么写的

ActionScript Code:
  1. function isEqual (num1:Number, num2:Number):Boolean
  2. {
  3.     if (num1 == num2)
  4.     {
  5.         return true;
  6.     }
  7.     else
  8.     {
  9.         return false;
  10.     }
  11. }


这段代码使用if、else语句和==操作符就行判断,基本上能满足要求。
一部分人是这么写的

ActionScript Code:
  1. function isEqual (num1:Number, num2:Number):Boolean
  2. {
  3.     return num1 == num2;
  4. }

这段代码比第一段代码要简洁,效果跟第一段代码一样。
但是前面两段代码都存在Bug,可以试下

ActionScript Code:
  1. trace(isEqual(2.1 / 3, 0.7));

输出结果是

Output Code:
  1. false

原因是计算机在处理小数时存在误差,二进制不能准确的表示很多小数。
改进的做法是像下面这样

ActionScript Code:
  1. function isEqual (num1:Number, num2:Number):Boolean
  2. {
  3.     return Math.abs (num1 - num2) < 0.000001;
  4. }

在现实应用中,比较两个数是否相等都有不同的额外规则,很多时候并不要求精确相等,很多情况下只要结果是在 某个范围内都应该是允许的,比如做吸附效果,只要进入某个区域就会自动附着到目标点上,所以我们应该再改进为如下

ActionScript Code:
  1. function isEqual (num1:Number, num2:Number, offset:Number):Boolean
  2. {
  3.     if(arguments.length < 3)
  4.     {
  5.         offset = 0.000001;
  6.     }
  7.     return Math.abs (num1 - num2) < offset;
  8. }

这段代码允许我们设定允许的误差,如果不设定就为默认的0.000001。
我把这道题作为面试题目,就是想看下ASer的经验。其实这道题并不是很简单的。|-_-

随机文章:

Leave a Reply