JavaScript数学.最小返回错误的值
JavaScript Math.min returns wrong value
我使用John Resig的函数来查找数组中的最小值,但它以某种方式返回底层值。这是一个演示,这是代码。
var arr = Math.min.apply(Math, [310127563311820800, 310127563190202368, 310127563110502401, 310127562443595776, 310127562326163457, 310127561751556097]);
document.write(arr);
你能解释一下发生了什么,为什么它返回错误的(地板)值?
问题不在于找到最小值,而在于使用这些数字。你不能在JavaScript中将它们表示为数字,因为整数只能完全保存在-9007199254740992
和+9007199254740992
之间。
这是因为JavaScript中的所有数字都是双精度IEEE754浮点数,尾数的大小是53。
参见ECMAScript规范中关于数字类型的更多细节:
注意大小为no的所有正整数和负整数大于253的都可以用Number类型表示(实际上整数0有两种表示(+0和-0)。
要处理这些数字(并找到它们的最小值),您需要使用原生JavaScript数字以外的另一种表示。希望有许多库处理大数,例如bignum(但您应该谷歌并选择您喜欢的一个)。
在javascript中,除非输入字符串为数字,否则会失去精度。
如果它们都是正整数,则可以对它们进行排序并返回索引最低的元素,记住数字多的字符串必须大于数字少的字符串-
var input= ['310127563311820800', '310127563190202368', '310127563110502401',
'310127562443595776', '310127562326163457', '310127561751556097'];
var minim= input.slice(0).sort(function(a, b){
if(a=== b) return 0;
if(a.length!= b.length) return a.length-b.length;
return a>b? 1:-1;
})[0];
alert(minim);
/* returned value: (String)
310127561751556097
*/
如果不需要保持原始顺序,可以跳过切片(0)位。
相关文章:
- CKFinder 3为所选文件返回错误的URL
- 从我的控制器返回一个不同于200的代码以触发ajax错误,这被认为是一种好的做法吗
- AngularJS错误:提供程序必须从$get工厂方法返回值
- 用于查询错误转换的角度资源返回列表
- 如何解决“;错误所请求的URL返回500-内部服务器错误”;
- WebView返回错误的window.innerHeight
- Javascript表单验证:表单在错误返回时提交:
- 谷歌地图上的常量错误返回maxZoomService.getMaxZoomAtLatLng()
- Jquery .ajax POST 函数错误返回 asp.net MVC.
- happy 不会从 Boom 错误返回数据属性
- 操作结果在 ajax 调用中作为错误返回
- 我得到了错误“返回绑定”.PBKDF2(密码、盐、迭代、keylen、回调);^ TypeError: Not a bu
- 节点解析错误:返回时意外的令牌
- Bluebird承诺库的结果作为错误返回
- Jquery, php ajax post 500内部服务器错误返回
- 未定义的索引问题和错误返回
- 未从json文件中导入数据:Unhandled rejection错误返回
- Jquery错误返回bool值
- 表单提交后重新加载页面,尽管没有验证和错误返回
- 使用POST方法的AJAX函数会创建以下错误.错误:返回状态码414请求uri太大