最近項(xiàng)目中用到了圖數(shù)據(jù)庫,最終選擇的是OrientDB.
OrientDB本身提供了一個(gè)WEB 的操作界面,總體來說,挺好用的...
但是昨天遇到一個(gè)問題,折騰了好久。不過,最后問題還是找到了。
先看一個(gè)錄屏吧,看能不能發(fā)現(xiàn)問題所在....

yk: 1847092548766533637L
在UserList中添加一條記錄,字段 id (long) 插入 1847092548766533639,?
點(diǎn)擊SAVE(保存),發(fā)現(xiàn)立即變成了 1847092548766533600
通過查詢語句可以查到結(jié)果:
select * from `UserList` where id = 1847092548766533600
通過 1847092548766533639 進(jìn)行檢索,查不到結(jié)果:
select * from `UserList` where id = 1847092548766533639
通過 1847092548766533600 進(jìn)行刪除,可以成功刪除:
delete from `UserList` where id = 1847092548766533600
后來,反復(fù)確認(rèn)和排查,發(fā)現(xiàn)是JavaScript 數(shù)據(jù)精度的問題。
對(duì)于大于 2的53次方(9007199254740991)的整數(shù)(long), 數(shù)據(jù)會(huì)溢出,丟失精度。
>>> 2**53-1
9007199254740991
>>> len('9007199254740991')
16
對(duì)此的解決方案有:
1. 降低字段id的精度,字段id的最大精度為長度為15的整數(shù);
2.WEB后端(Python后端)和WEB前端數(shù)據(jù)交互的時(shí)候,使用字符串(string)來傳遞。在后端,涉及數(shù)據(jù)庫操作的時(shí)候,再造型為整數(shù)。
擴(kuò)展閱讀
[JavaScript數(shù)字精度丟失問題總結(jié)](http://www.cnblogs.com/snandy/p/4943138.html)
http://www.cnblogs.com/snandy/p/4943138.html
簡介:
對(duì)于整數(shù),前端出現(xiàn)問題的幾率可能比較低,畢竟很少有業(yè)務(wù)需要需要用到超大整數(shù),只要運(yùn)算結(jié)果不超過 Math.pow(2, 53) 就不會(huì)丟失精度。
對(duì)于小數(shù),前端出現(xiàn)問題的幾率還是很多的,尤其在一些電商網(wǎng)站涉及到金額等數(shù)據(jù)。解決方式:把小數(shù)放到位整數(shù)(乘倍數(shù)),再縮小回原來倍數(shù)(除倍數(shù))
javascript 精度問題導(dǎo)致后端傳過來的值顯示不正確,有何好的解決辦法?
https://www.zhihu.com/question/34564427?sort=created
http://www.iteye.com/news/28410
[4 個(gè)用于執(zhí)行高級(jí)數(shù)學(xué)計(jì)算的 JavaScript 庫](http://www.iteye.com/news/28410)
簡介:
在使用JavaScript執(zhí)行數(shù)學(xué)方面的任務(wù)時(shí),往往要用到浮點(diǎn)運(yùn)算,且需要精確到某位小數(shù),這就容易造成錯(cuò)誤,而且會(huì)相當(dāng)費(fèi)時(shí)。因此,如果你需要做一些高精度的數(shù)學(xué)計(jì)算的編程工作,比如財(cái)務(wù)或科學(xué)計(jì)算,那么你一定需考慮使用下面的這些庫。
numbers.js
Numeric Javascript
Tangle
accounting.js
用 javascript 做科學(xué)計(jì)算的最佳的方案是什么?
https://www.zhihu.com/question/40585948?sort=created
簡介:
題主提到了Python,就默認(rèn)題主會(huì)Python好了。我建議用ipython notebook。安裝Anaconda就可以用它了。它可以讓你在瀏覽器上運(yùn)行和展示Python。
js不適合做科學(xué)計(jì)算,科學(xué)計(jì)算應(yīng)該放在后臺(tái),用java,c++等語言實(shí)現(xiàn),然后將計(jì)算后的結(jié)果通過js傳遞到前臺(tái)的web界面。js是弱類型語言,用瀏覽器做計(jì)算那不太操蛋了嗎