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 相关文章推荐
JavaScript 选中文字并响应获取的实现代码
Aug 28 Javascript
封装好的js判断操作系统与浏览器代码分享
Jan 09 Javascript
javascript实现详细时间提醒信息效果的方法
Mar 11 Javascript
jQuery实现的网页竖向菜单效果代码
Aug 26 Javascript
jQuery EasyUi实战教程之布局篇
Jan 26 Javascript
完善的jquery处理机制
Feb 21 Javascript
原生js封装的一些jquery方法(详解)
Sep 20 Javascript
React Native使用Modal自定义分享界面的示例代码
Oct 31 Javascript
jquery自定义显示消息数量
Dec 19 jQuery
详解javascript中的变量提升和函数提升
May 24 Javascript
微信小程序开发打开另一个小程序的实现方法
May 17 Javascript
浅析JavaScript 函数防抖和节流
Jul 13 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
php 什么是PEAR?(第二篇)
2009/03/19 PHP
php实现购物车产品删除功能(2)
2020/07/23 PHP
JavaScript人脸识别技术及脸部识别JavaScript类库Tracking.js
2015/09/14 Javascript
javascript精确统计网站访问量实例代码
2015/12/19 Javascript
JS组件Bootstrap Table使用方法详解
2016/02/02 Javascript
微信小程序 教程之注册程序
2016/10/17 Javascript
基于javascript的Form表单验证
2016/12/29 Javascript
jQuery取得元素标签名称小结(附代码)
2017/08/16 jQuery
纯JS实现可用于页码更换的飞页特效示例
2018/05/21 Javascript
详解vue axios用post提交的数据格式
2018/08/07 Javascript
vue上传图片到oss的方法示例(图片带有删除功能)
2018/09/27 Javascript
[49:02]KG vs Infamous 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
Python爬取十篇新闻统计TF-IDF
2018/01/03 Python
selenium获取当前页面的url、源码、title的方法
2019/06/12 Python
python实现PCA降维的示例详解
2020/02/24 Python
python 解决selenium 中的 .clear()方法失效问题
2020/09/01 Python
如何在scrapy中捕获并处理各种异常
2020/09/28 Python
Python爬虫定时计划任务的几种常见方法(推荐)
2021/01/15 Python
详解Django中的FBV和CBV对比分析
2021/03/01 Python
设计师家具购买和委托在线市场:Viyet
2016/11/16 全球购物
微软瑞士官方网站:Microsoft瑞士
2018/04/20 全球购物
100%植物性、有机、即食餐:Sakara Life
2018/10/25 全球购物
应届生.NET方向面试题
2015/05/23 面试题
高中生学习生活的自我评价
2013/11/27 职场文书
淘宝网店营销策划书
2014/01/11 职场文书
《美丽的小兴安岭》教学反思
2014/02/26 职场文书
完美的中文自荐信
2014/05/24 职场文书
改进作风怎么办发言材料
2014/08/17 职场文书
英文演讲稿开场白
2014/08/25 职场文书
毕业生代领毕业材料的授权委托书
2014/09/29 职场文书
群众路线教育实践活动民主生活会个人检查对照思想汇报
2014/10/04 职场文书
六查六看心得体会
2014/10/14 职场文书
2014年结对帮扶工作总结
2014/12/17 职场文书
电子商务专业求职信范文
2015/03/19 职场文书
PHP策略模式写法
2021/04/01 PHP
解决linux下redis数据库overcommit_memory问题
2022/02/24 Redis