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面向对象编程
Mar 04 Javascript
js控制网页背景音乐播放与停止的方法
Feb 06 Javascript
jQuery插件Tmpl的简单使用方法
Apr 27 Javascript
javascript表单处理具体实现代码(表单、链接、按钮)
May 07 Javascript
使用vue与jquery实时监听用户输入状态的操作代码
Sep 19 jQuery
Angularjs cookie 操作实例详解
Sep 27 Javascript
SeaJS中use函数用法实例分析
Oct 10 Javascript
学习Vue组件实例
Apr 28 Javascript
layui前端时间戳转化实例
Nov 15 Javascript
vue-video-player实现实时视频播放方式(监控设备-rtmp流)
Aug 10 Javascript
vue使用exif获取图片旋转,压缩的示例代码
Dec 11 Vue.js
vue集成一个支持图片缩放拖拽的富文本编辑器
Jan 29 Vue.js
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中一个控制字符串输出的函数
2006/10/09 PHP
PHP获取网站域名和地址的代码
2008/08/17 PHP
Windows下安装Memcached的步骤说明
2010/04/25 PHP
限制ckeditor上传图片文件大小的方法
2013/11/15 PHP
PHP输出英文时间日期的安全方法(RFC 1123格式)
2014/06/13 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
Jquery数独游戏解析(一)-页面布局
2010/11/05 Javascript
一些主流JS框架中DOMReady事件的实现小结
2011/02/12 Javascript
关于JavaScript中string 的replace
2013/04/12 Javascript
jQuery实现等比例缩放大图片让大图片自适应页面布局
2013/10/16 Javascript
当jQuery1.7遇上focus方法的问题
2014/01/26 Javascript
js事件监听机制(事件捕获)总结
2014/08/08 Javascript
vue.js中$watch的用法示例
2016/10/04 Javascript
微信小程序-获得用户输入内容
2017/02/13 Javascript
整理关于Bootstrap模态弹出框的慕课笔记
2017/03/29 Javascript
如何从零开始利用js手写一个Promise库详解
2018/04/19 Javascript
JS实现的3des+base64加密解密算法完整示例
2018/05/18 Javascript
你不知道的Vue技巧之--开发一个可以通过方法调用的组件(推荐)
2019/04/15 Javascript
vue从一个页面跳转到另一个页面并携带参数的解决方法
2019/08/12 Javascript
[44:04]OG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python 简易计算器程序,代码就几行
2009/08/29 Python
tensorflow学习笔记之mnist的卷积神经网络实例
2018/04/15 Python
python list删除元素时要注意的坑点分享
2018/04/18 Python
Pycharm新建模板默认添加个人信息的实例
2019/07/15 Python
使用tensorflow显示pb模型的所有网络结点方式
2020/01/23 Python
Django数据库迁移常见使用方法
2020/11/12 Python
css3 border-image使用说明
2010/06/23 HTML / CSS
商场消防演习方案
2014/02/12 职场文书
社区交通安全实施方案
2014/03/22 职场文书
《冬阳童年骆驼队》教学反思
2014/04/15 职场文书
忠诚奉献演讲稿
2014/09/12 职场文书
Python内置数据结构列表与元组示例详解
2021/08/04 Python
Nginx缓存设置案例详解
2021/09/15 Servers
Django实现WebSocket在线聊天室功能(channels库)
2021/09/25 Python
HTML中的表单元素介绍
2022/02/28 HTML / CSS
Z-Order加速Hudi大规模数据集方案分析
2022/03/31 Servers