javascript没有长整型
记录一下前几天踩坑的经历。
背景:一个项目某一版之后很多用easyui的表格控件treegrid渲染的表格都显示不出来了
奇怪的地方主要有以下几点:
- 项目在测试环境才会这样,在本机能够正常运行,多次重新发布后无果
- 有很多表格显示不出来,但也有的代码几乎一样的表格却能正常显示数据
- 重新部署曾经可以正常运行的版本后依然如此
测试环境有问题本地没问题的情况我也是见得不少了,无论如何先F12看看
Uncaught TypeError: Cannot read property 'length' of undefined
观察异常栈,是easyui报的这个错,吐槽一下easyui报的错太不友好。这样很难看出问题,于是我又把测试服务器返回的html与本地服务器返回的html用工具进行比较,结果是只有渲染服务器地址的部分不一样(一个是localhost一个是ip)没看出来任何问题。观察ajax请求的数据,只有数据的id不一样(这是伏笔),id是后台随机生成的用于作表格的唯一标识符,也没有看出来问题。无奈之下,我只有debug到easyui的源码分析原因。
一个小时后。。。
通过对比服务端和本地的代码运行状况,观察差异,找到了报错的原因:id有重复,id重复导致树结构混乱,通过parentId查找父节点时查找到的是错误的父节点。这里再次吐槽一下easyui,您不能先验证一遍id有没有重复,有提示一下不好吗?无论如何,我找到了报错原因,那么接下来问题来了:为什么id会有重复?
前面有提到这里是用的是treegrid控件,这里树有三级,后台方法使用System.nanoTime()
方法产生一个随机数作为id设置给第二,三级树节点。这个方法返回的是Long
值
现在一切都可以解释了。
1.项目在测试环境才会这样,在本机能够正常运行,多次重新发布后无果
System.nanoTime()
产生的id会因为环境而有差异,在本地产生的id可能并未达到浮点数精度丢失的范围,而服务端产生的id超过了,导致了精度丢失,不一样的长整型由js处理后转换成浮点数后得到的结果是一样的,10000000000000000和10000000000000001得到的结果是一样的,从而导致了id重复
2.有很多表格显示不出来,但也有的代码几乎一样的表格却能正常显示数据
这一点是数据的问题,表格本身几乎一样但数据不一样,显示出数据的表格没有第三级节点,而报错的表格有,一二级节点因为是父节点所以都有children
属性,easyui的treegrid根据此属性形成树结构,而第三级节点没有children
属性因为它根本没有子节点,从而导致报错Uncaught TypeError: Cannot read property 'length' of undefined
3.重新部署曾经可以正常运行的版本后依然如此
因为相关代码并没有变动,这是一个地雷,早早埋下而不知何时会爆炸的地雷。
根本原因为后台返回的Long
类型数据由js处理后可能导致精度丢失。最后解决方案非常简单,把long转换成int就一切解决了。由此得出教训,后台返回给js的数据不要使用Long类型。
参见:
What is JavaScript's highest integer value that a number can go to without losing precision?
javascript没有长整型的更多相关文章
- python基础知识2——基本的数据类型——整型,长整型,浮点型,字符串
磨人的小妖精们啊!终于可以归置下自己的大脑啦,在这里我要把--整型,长整型,浮点型,字符串,列表,元组,字典,集合,这几个知识点特别多的东西,统一的捯饬捯饬,不然一直脑袋里面乱乱的. 对于Python ...
- Python基础:数值(布尔型、整型、长整型、浮点型、复数)
一.概述 Python中的 数值类型(Numeric Types)共有5种:布尔型(bool).整型(int).长整型(long).浮点型(float)和复数(complex). 数值类型支持的主要操 ...
- Java把长整型时间转成字符串日期
数据库里存放的是timestamp格式,前端取得后是这种:1436255550710长整型时间截转换成"2015-07-07"这种格式呢? import java.io.IOExc ...
- Python基础:1.数据类型(空、布尔类型、整型、长整型、浮点型、字符串)
提示:python版本2.7,windows系统 Python提供的基本数据类型:空.布尔类型.整型.长整型.浮点型.字符串.列表.元组.字典.日期 1.空(None) None,是一个特殊的值,不能 ...
- JAVA 长整型转换为IP地址的方法
JAVA 长整型转换为IP地址的方法 代码例如以下: /** * 整型解析为IP地址 * @param num * @return */ public static String int2iP(Lon ...
- Long.parseLong(String s) 其中s必须是数字形式的字符串,才能运用该函数转化为长整型。
public class ConverTo { public static void main(String [] args) { String numberIn =args[0]; convertN ...
- php长整型完整输出
今天调用webservice时返回一个字段是int64 长整型 原始的数值应该是 190000002101056096 而php返回时转成 1.9000000210106E+17 当传入另一个接口就报 ...
- PHP长整型在32位系统中强制转化溢出
CleverCode近期遇到一个PHP项目整形转化问题,mysql有一个字段id是bigint的,里面有长整型,如id = 5147486396.可是php代码因为历史原因却部署在多台机器中,当中A机 ...
- Mac地址转换成long长整型 2
数据之间的转换可以使用 System.Convert Mac地址转换成long长整型 /// <summary> /// 解析长整形的数据使其转换为macID /// </sum ...
随机推荐
- R语言学习——因子
变量可分为名义型变量.有序型变量或者连续型变量.名义型变量是没有顺序之分的类别变量,如糖尿病类型Diabetes(Type1.Type2),即使在数据中Type1编码为1而Type2编码为2,这也并不 ...
- 【转】Android OkHttp3简介和使用详解
一 OKHttp简介 OKHttp是一个处理网络请求的开源项目,Android 当前最火热网络框架,由移动支付Square公司贡献,用于替代HttpUrlConnection和Apache HttpC ...
- WinForm程序完全退出总结
this.Close(); 只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退出: Application.Exit(); 强制所有消息中止,退出 ...
- 二十九、layui分页插件的使用
<div id="page1"></div> <script> //开启分页 var page = 1; function findstoreL ...
- 分治FFT的三种含义
分治FFT是几个算法的统称.它们之间并无关联. 分治多项式乘法 问题如求\(\prod_{i=1}^na_ix+b\). 若挨个乘复杂度为\(O(n^2\log n)\),可分治做这件事,复杂度为\( ...
- jenkins部署net core初探
一步一步,小心翼翼吖.看了好几个博客,摸索了两天了,才搭建成功,不容易,先写篇文章记下来,hhhhhhhhhhhh 相关环境配置 服务器:centos7 源代码管理器:git 技术选型:net cor ...
- Python 执行 shellcode
import urllib2 import ctypes import base64 # 从我们的web服务器上下载shellcode url = "http://rinige.com/sh ...
- php中一些容易混淆的函数总结
在我们日常PHP开发中,经常会使用一些函数完成相关操作,但是有些函数功能相近,很容易混淆,再次总结一下 1. __DIR__ && getcwd() 看官方解释: getcwd: ...
- asp.net core 中间件粗解
中间件 中间件在asp.net core中非常重要,它用来处理httpcontext.而httpcontext封装了请求和响应.也就是说,中间件是用来处理请求和响应的. 本质上,中间件被封装到了IAp ...
- Teching Yourself Programming in Ten Years -Peter Norvig
http://norvig.com/21-days.html 我们经常能看到“7天搞定51单片机”.“21天学会C++”这样样式的标题,编程真的很容易吗?似乎比其他事情要简单很多呀!是的,糟糕的编程确 ...