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 ...
随机推荐
- 网络流之P3254 圆桌问题
题目描述 假设有来自m 个不同单位的代表参加一次国际会议.每个单位的代表数分别为ri (i =1,2,……,m). 会议餐厅共有n 张餐桌,每张餐桌可容纳ci (i =1,2,……,n)个代表就餐. ...
- centos7下kubernetes(15。kubernetes-外网访问service)
kubernetes提供了多种类型的service,默认是cluster IP ClusterIP cluster内部IP对外提供服务,只有cluster内的节点和pod可访问,这是默认的servic ...
- 洛谷P2243 电路维修
题目地址 转化为图论问题 对于每个交叉点(X,Y)抽象成节点.与它相邻的四个点中,可以直接连线的边权为0,否则边权为1. 用死了的SPFA解决图论问题. #include <cstring> ...
- opn要求
1.在公司 ♦可以通过阿里云的公网ip访问pg 2.不在公司 ♦需要连接VPN才可访问阿里云的公网ip的应用(假定pg),但是特别的应用不在公司也可直接访问(假定gitlab) 思路提示:vpn黑白名 ...
- App遍历探讨(含源代码)
好像好久没有更新博客了,之前写的几篇博客关于自动化的框架的居多,其中好多博友向我提了好多问题,我没有回复.这里给博友道个歉~ ~ 总结几点原因如下: 1.我一般很少上博客,看到了都是好几天之前的问题 ...
- yafu安装使用方法以及mismatched parens解决方法
yafu用于自动整数因式分解,在RSA中,当p.q的取值差异过大或过于相近的时候,使用yafu可以快速的把n值分解出p.q值,原理是使用Fermat方法与Pollard rho方法等. 再摘录官方的一 ...
- c++ fmt 库安装和使用示例
安装: 1 git clone https://github.com/fmtlib/fmt.git 2. cmake . 3. make && make install #incl ...
- pyspider爬虫框架
特点: 去重处理,结果监控,多进程处理,pyquery提取,错误重试,webUI管理,代码简洁,JS渲染 安装: anaconda里边没搜到pyspider,所以手动安装 查看pyspider的命令: ...
- iview 动态渲染menu时active-name无效的问题
动态渲染menu时,如果需要active-name,那么name只能绑定index,动态渲染的数组初始必须有一个空对象.否则无法使用active-name属性.注:仅限3.0版本,不排除新版本修复的可 ...
- 其它综合-有关service、systemctl、chkconfig、init
有关service.systemctl.chkconfig.init CentOS 7.x 开始,CentOS 开始使用 systemd 服务来代替 daemon,原来管理系统启动和管理系统服务的相关 ...