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 ...
随机推荐
- ubuntu18.04搭建hive
hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行. 其优点是学习成本低,可以通过 ...
- 轻量级卷积神经网络——MobileNet
谷歌论文题目: MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications 其他参考: CNN ...
- Linux下添加windows字体
在Linux下使用wqy字体,在视觉效果上就已近很好了,其实没有必要添加windows字体.但是显然有些人(比如领导,^..^)就喜欢宋体.楷体,所以添加windows字体有时还是需要的,幸运的是这件 ...
- fliplr函数
fliplr 左右翻转矩阵 语法: B = fliplr(A) 将矩阵A的列绕垂直轴进行左右翻转 matabc 如果A是一个行向量,fliplr(A)将A中元素的顺序进行翻转. 如果A是一个列向量, ...
- wps for linux显示系统缺失字体解决办法
1.下载字体库 链接: https://pan.baidu.com/s/1xil5_i9M53fM7EQNIt3Mcw 密码: jqnu 2.解压 sudo unzip wps_symbol_font ...
- WebApi的自定义Filter
using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using Syst ...
- CSL 的魔法
链接 [https://ac.nowcoder.com/acm/contest/551/E] 分析 很显然就是a的第k大得和b的倒数第k大相乘. 那么我们只要让a的第k大和b的倒数第k大位置是相同的即 ...
- たくさんの数式 / Many Formulas AtCoder - 2067 (枚举二进制)
Problem Statement You are given a string S consisting of digits between 1 and 9, inclusive. You can ...
- 一.从零认识XAML
一.XMAL的简单了解 XAML读做zaml,,它是WPF中专门用于设计UI的语言,它简单易懂,结构清晰.是一种声明式语言,当你见到一个标签时,就意味着声明了一个对象:对象之间的层级关系要么是并列,要 ...
- 数据库主键到底是用自增长(INT)好还是UUID好
其实针对使用自增长还是UUID,大家讨论最多的就是速度和存储空间,这里我加入了安全性和分布式,具体对比如下: 使用自增长做主键的优点:1.很小的数据存储空间2.性能最好3.容易记忆使用自增长做主键的缺 ...