OrientDB 使用过程中遇到的一个“BUG”

最近项目中用到了图数据库,最终选择的是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是弱类型语言,用浏览器做计算那不太操蛋了吗

你可能感兴趣的:(OrientDB 使用过程中遇到的一个“BUG”)