最近项目中用到了图数据库,最终选择的是OrientDB.
OrientDB本身提供了一个WEB 的操作界面,总体来说,挺好用的...
但是昨天遇到一个问题,折腾了好久。不过,最后问题还是找到了。
先看一个录屏吧,看能不能发现问题所在....
OrientDB录屏yk: 1847092548766533637L
在UserList中添加一条记录,字段 id (long) 插入 1847092548766533639,
点击SAVE(保存),发现立即变成了 1847092548766533600
通过查询语句可以查到结果:
select * from `UserList` where id = 1847092548766533600
通过 1847092548766533639 进行检索,查不到结果:
select * from `UserList` where id = 1847092548766533639
通过 1847092548766533600 进行删除,可以成功删除:
delete from `UserList` where id = 1847092548766533600
后来,反复确认和排查,发现是JavaScript 数据精度的问题。
对于大于 2的53次方(9007199254740991)的整数(long), 数据会溢出,丢失精度。
>>> 2**53-1
9007199254740991
>>> len('9007199254740991')
16
对此的解决方案有:
1. 降低字段id的精度,字段id的最大精度为长度为15的整数;
2.WEB后端(Python后端)和WEB前端数据交互的时候,使用字符串(string)来传递。在后端,涉及数据库操作的时候,再造型为整数。
扩展阅读
[JavaScript数字精度丢失问题总结](http://www.cnblogs.com/snandy/p/4943138.html)
http://www.cnblogs.com/snandy/p/4943138.html
简介:
对于整数,前端出现问题的几率可能比较低,毕竟很少有业务需要需要用到超大整数,只要运算结果不超过 Math.pow(2, 53) 就不会丢失精度。
对于小数,前端出现问题的几率还是很多的,尤其在一些电商网站涉及到金额等数据。解决方式:把小数放到位整数(乘倍数),再缩小回原来倍数(除倍数)
javascript 精度问题导致后端传过来的值显示不正确,有何好的解决办法?
https://www.zhihu.com/question/34564427?sort=created
http://www.iteye.com/news/28410
[4 个用于执行高级数学计算的 JavaScript 库](http://www.iteye.com/news/28410)
简介:
在使用JavaScript执行数学方面的任务时,往往要用到浮点运算,且需要精确到某位小数,这就容易造成错误,而且会相当费时。因此,如果你需要做一些高精度的数学计算的编程工作,比如财务或科学计算,那么你一定需考虑使用下面的这些库。
numbers.js
Numeric Javascript
Tangle
accounting.js
用 javascript 做科学计算的最佳的方案是什么?
https://www.zhihu.com/question/40585948?sort=created
简介:
题主提到了Python,就默认题主会Python好了。我建议用ipython notebook。安装Anaconda就可以用它了。它可以让你在浏览器上运行和展示Python。
js不适合做科学计算,科学计算应该放在后台,用java,c++等语言实现,然后将计算后的结果通过js传递到前台的web界面。js是弱类型语言,用浏览器做计算那不太操蛋了吗
网友评论