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的caller,callee,call,apply
Apr 28 Javascript
javascript学习笔记(二) js一些基本概念
Jun 18 Javascript
JavaScript控制网页层收起和展开效果的方法
Apr 15 Javascript
Bootstrap学习笔记之js组件(4)
Jun 12 Javascript
概述BootStrap中role=&quot;form&quot;及role作用角色
Dec 08 Javascript
浅析javaScript中的浅拷贝和深拷贝
Feb 15 Javascript
angularjs下拉框空白的解决办法
Jun 20 Javascript
js编写简单的计时器功能
Jul 15 Javascript
详解vue 图片上传功能
Apr 30 Javascript
vue实现设置载入动画和初始化页面动画效果
Oct 28 Javascript
微信小程序学习总结(四)事件与冒泡实例分析
Jun 04 Javascript
JavaScript实现烟花绽放动画效果
Aug 04 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
laravel model模型定义实现开启自动管理时间created_at,updated_at
2019/10/17 PHP
JavaScript基本概念初级讲解论坛贴的学习记录
2009/02/22 Javascript
extjs 为某个事件设置拦截器
2010/01/15 Javascript
Javascript面向对象扩展库代码分享
2012/03/27 Javascript
js数组的基本用法及数组根据下标(数值或字符)移除元素
2013/10/20 Javascript
jquery 判断滚动条到达了底部和顶端的方法
2014/04/02 Javascript
node.js中的emitter.emit方法使用说明
2014/12/10 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
简单掌握JavaScript中const声明常量与变量的用法
2016/05/21 Javascript
基于Bootstrap+jQuery.validate实现表单验证
2016/05/30 Javascript
JavaScript中的this使用详解
2016/07/27 Javascript
Vue.js动态组件解析
2016/09/09 Javascript
JavaScript中 DOM操作方法小结
2017/04/25 Javascript
JS分页的实现(同步与异步)
2017/09/16 Javascript
vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单
2018/09/14 Javascript
vue组件实践之可搜索下拉框功能
2018/11/25 Javascript
微信小程序 image组件遇到的问题
2019/05/28 Javascript
python中遍历文件的3个方法
2014/09/02 Python
使用Python脚本和ADB命令实现卸载App
2017/02/10 Python
Python编程求质数实例代码
2018/01/31 Python
PyTorch的Optimizer训练工具的实现
2019/08/18 Python
opencv+python实现鼠标点击图像,输出该点的RGB和HSV值
2020/06/02 Python
英国最大的在线奢侈手表零售商:Jura Watches
2018/01/29 全球购物
世界上最大的字体市场:MyFonts
2020/01/10 全球购物
澳大利亚人信任的清洁平台,您的私人管家:Jarvis
2020/12/25 全球购物
数据库的约束含义
2012/09/09 面试题
安全生产检讨书
2014/01/21 职场文书
大学英语演讲稿范文
2014/04/24 职场文书
离婚协议书范文2014
2014/10/16 职场文书
2014大学辅导员工作总结
2014/12/02 职场文书
接待员岗位职责
2015/02/13 职场文书
2015年科研工作总结范文
2015/05/13 职场文书
公司保密管理制度
2015/08/04 职场文书
2016党员干部廉政准则学习心得体会
2016/01/20 职场文书
Vue监视数据的原理详解
2022/02/24 Vue.js
Python 读取千万级数据自动写入 MySQL 数据库
2022/06/28 Python