javascript下数值型比较难点说明


Posted in Javascript onJune 07, 2010

1、数字长长的,在c#里合法的长整型数字在javascript下竟然......
看下面几行简单代码:

var a = 2010060612120909191; //按时间生成的Id1 
var b = 2010060612120909199; //按时间生成的Id2 
alert(a == b); 
//alert(a); //有什么惊人发现吗? 
//alert(b); //最后几位好像... 
//alert(Number(a) == Number(b)); 
//alert(parseInt(a, 10) == parseInt(b, 10)); 
//alert(parseFloat(a) == parseFloat(b));

您可以拷贝代码自己在本地测试一下。实际运行的结果是,a和b竟然相等,弹出的是“true”。反正楼猪第一次碰到这种情况的时候感到一丝意外。然后楼猪分别让两个数字弹出,这次又意外发现数字改变成了“2010060612120909300”。最后又测试了一下和数字相关的Number,parseInt和parseFloat函数,三个结果依旧是true。
然后楼猪把数字型调整成字符串类型,如下:
代码
var a = "2010060612120909191"; //按时间生成的Id1 
var b = "2010060612120909199"; //按时间生成的Id2 
alert(a == b);//false 
alert(a); //2010060612120909191 
alert(b); //2010060612120909199 
alert(Number(a) == Number(b)); //? 
alert(parseInt(a, 10) == parseInt(b, 10));//? 
alert(parseFloat(a) == parseFloat(b));//?

这次预料中的前三个都没有问题,可是转换成数值型的比较依旧返回true。
是不是这里测试的两个数字都不在javascript的数字限定范围内呢?可是为什么弹出的数字改变成了“2010060612120909300”(百位数字太诡异了)?
自己google无果后,采用了下面的函数比较两个长整型的数字大小:
// 数字比较大小 (两个输入为字符串或数字类型,长数型数字比较) 
function compareNumber(prevNum, nextNum) { 
if (isNaN(prevNum) || prevNum.length == 0) { 
throw new Error("第一个输入非数字"); 
} 
else if (isNaN(prevNum) || prevNum.length == 0) { 
throw new Error("第二个输入非数字"); 
} 
var result = 0; //返回结果 0:两个相等 1:第一个数字大于第二个 -1:第二个数字大于第一个 
if (prevNum.length > nextNum.length) { 
result++; 
} 
else if (prevNum.length < nextNum.length) { 
result--; 
} 
else { 
//位数一样 
for (var i = 0; i < prevNum.length; i++) { 
var charNum1 = prevNum.toString().charAt(i); 
var charNum2 = nextNum.toString().charAt(i); 
if (parseInt(charNum1) > parseInt(charNum2)) { 
result++; 
break; 
} 
else if (parseInt(charNum2) > parseInt(charNum1)) { 
result--; 
break; 
} 
} 
} 
return result; 
}

2、带个小数点的,parseInt的取舍
这个问题有的javascript书上已经讲过。看下面的代码:
var a = 0.000001; 
var b = 0.0000001; 
alert(parseInt(a)); 
alert(parseInt(b)); 
//alert(parseInt(b, 10));//难道是没填写10进制的原因

您可能已经知道了。parseInt(b)返回的竟然是1!然后,将a和b换成字符串测试一下:
var a = "0.000001"; 
var b = "0.0000001"; 
alert(parseInt(a)); 
alert(parseInt(b));

这一次,a和b返回的都是0。这个才是我们想要的预期的结果。然后楼猪大胆猜测,据说javascript处理数字碰到以0开头的有的时候是当做八进制处理的。这一想,kao,有道理。可是这里我们测试的两个浮点数字a和b都是以0开头啊?好吧,楼猪是真的想不到其他原因了,只好对产生奇怪结果的数字b,又改成parseInt(b, 10)测试一下,晕,还是1。然后,楼猪又Number和parseFloat测试了一下:
var a = 0.000001; 
var b = 0.0000001; 
alert(Number(a)); 
alert(Number(b));//1e-7 
alert(parseFloat(a)); 
alert(parseFloat(b)); //1e-7

哈哈,这次楼猪似乎接近发现真相了。b在Number和parseFloat之后,都弹出1e-7,科学计数法嘛。看来还真的是八进制的问题。然后nc楼猪想当然地以为只要先将要parseInt的数字先toString或者String一下问题就可以解决了:
var b = 0.0000001; 
alert(parseInt(b.toString(), 10)); 
alert(parseInt(String(b), 10));

晕啊,这次怎么还是1呢?改成下面的还是一样的:
var b = String(0.0000001); 
alert(parseInt(b));

那么,对于这种八进制parseInt返回科学计数法的数字,我们怎么取整呢?按照开发需要,Math里有函数可以帮我们轻松实现功能的:
var b = 0.0000001; 
alert(Math.floor(b));

至于javascript常用的Math函数的floor和ceil方法的区别,您可以参考相关文档,这里不赘述。最后,期待您的宝贵意见和建议。
Javascript 相关文章推荐
JS应用之禁止抓屏、复制、打印
Feb 21 Javascript
用JS操作FRAME中的IFRAME及其内容的实现代码
Jul 26 Javascript
javascript快速排序算法详解
Sep 17 Javascript
JavaScript Math 对象常用方法总结
Apr 28 Javascript
关于网页中的无缝滚动的js代码
Jun 09 Javascript
jQuery事件对象总结
Oct 17 Javascript
如何在Angular2中使用jQuery及其插件的方法
Feb 09 Javascript
jquery图片放大镜效果
Jun 23 jQuery
使用 Javascript 实现浏览器推送提醒功能的示例
Nov 03 Javascript
当vue路由变化时,改变导航栏的样式方法
Aug 22 Javascript
ECharts地图绘制和钻取简易接口详解
Jul 12 Javascript
ant design实现圈选功能
Dec 17 Javascript
jQuery源码分析之Event事件分析
Jun 07 #Javascript
jQueryUI的Dialog的简单封装
Jun 07 #Javascript
jquery 的 $(&quot;#id&quot;).html() 无内容的解决方法
Jun 07 #Javascript
基于jquery+thickbox仿校内登录注册框
Jun 07 #Javascript
jquery 注意事项与常用语法小结
Jun 07 #Javascript
php上传图片并给图片打上透明水印的代码
Jun 07 #Javascript
指定位置如果有图片显示图片,无图片显示广告的JS
Jun 05 #Javascript
You might like
thinkPHP利用ajax异步上传图片并显示、删除的示例
2018/09/26 PHP
PHP实现提取多维数组指定一列的方法总结
2019/12/04 PHP
javascript new 需不需要继续使用
2009/07/02 Javascript
深入理解JavaScript高级之词法作用域和作用域链
2013/12/10 Javascript
Javascript实现禁止输入中文或英文的例子
2014/12/09 Javascript
JavaScript字符串常用的方法
2016/03/10 Javascript
判断是否存在子节点的实现代码
2016/05/18 Javascript
JavaScript接口的实现三种方式(推荐)
2016/06/14 Javascript
详解js中==与===的区别
2017/01/08 Javascript
jquery仿京东侧边栏导航效果
2017/03/02 Javascript
JavaScript数据结构之广义表的定义与表示方法详解
2017/04/12 Javascript
vue2的todolist入门小项目的详细解析
2017/05/11 Javascript
详解Angular路由 ng-route和ui-router的区别
2017/05/22 Javascript
ios中视频的最后一桢问题解决
2019/05/14 Javascript
jQuery层叠选择器用法实例分析
2019/06/28 jQuery
vue 需求 data中的数据之间的调用操作
2020/08/05 Javascript
Python Mysql自动备份脚本
2008/07/14 Python
八大排序算法的Python实现
2021/01/28 Python
用Python将动态GIF图片倒放播放的方法
2016/11/02 Python
Python实现向服务器请求压缩数据及解压缩数据的方法示例
2017/06/09 Python
python实现将汉字保存成文本的方法
2018/11/16 Python
python数据预处理方式 :数据降维
2020/02/24 Python
win10从零安装配置pytorch全过程图文详解
2020/05/08 Python
QML用PathView实现轮播图
2020/06/03 Python
python批量生成身份证号到Excel的两种方法实例
2021/01/14 Python
利用CSS3实现平移动画效果示例代码
2016/10/12 HTML / CSS
Senreve官网:美国旧金山的奢侈手袋品牌
2019/03/21 全球购物
Club Monaco加拿大官网:设计师男女服装
2019/09/29 全球购物
什么是规则表达式
2012/05/03 面试题
Python面试题:Python是如何进行内存管理的
2014/08/04 面试题
医学生实习自我鉴定
2013/09/27 职场文书
玲玲的画教学反思
2014/02/04 职场文书
竞选部长演讲稿
2014/04/26 职场文书
团队会宣传标语
2014/10/09 职场文书
颐和园的导游词
2015/01/30 职场文书
实现AJAX异步调用和局部刷新的基本步骤
2022/03/17 Javascript