2012-08-03 76 views
1

這不是一個真正的問題,因爲我確實有解決這個問題的方法,但我想我會讓每個人都知道,因爲它可能會對人們的方式產生相當廣泛的影響使用Google Web Toolkit。任意精度數字和Javascript,Google Web Toolkit

所以問題之一是Google gson代表JSON中的數字。例如,int myInt = 2將變爲"myInt":2long myLong = 5432198765L將變爲"myLong":5432198765,並且BigInteger myBI = 1310381093810938109481049128409487109378109248104098130981039810983將變成"myBI":1310381093810938109481049128409487109378109248104098130981039810983。儘管gson本身可以反序列化這個,但JSON中的GWT 2.4中的AutoBeans框架並不喜歡它。 Issue 6331修復了它在即將發佈的GWT 2.5版本中的長時間表示。但是,由於JavaScript數字精度的工作方式,issue 7555將不會被解決。

因此,我們需要將BigIntegers表示爲字符串,它將起作用,例如,String myBIStr = new BigInteger("1310381093810938109481049128409487109378109248104098130981039810983").toString()將表示爲"myBIStr":"1310381093810938109481049128409487109378109248104098130981039810983"。在GWT結束時,這將產生一個String,我們將不得不從它構建一個BigInteger。

這一切都非常有道理,爲什麼谷歌不會解決7555,但這導致我一個真正的開放性問題:如何處理Javascript中的高精度數字?一般來說,如果基於Web的Javascript和Google Web Toolkit前端要挑戰本地前端,那麼可能會出現我們使用任意精確數字的情況,而不是受到53位精確度comment 3談到。更糟的是,這個限制是否也影響了node.js或其他服務器端Javascript?

有沒有很好的解決方法,特別是使用Google Web Toolkit或無縫工作的工具?

回答

3

GWT可以對寬於53位的整數進行數學運算,因爲它模擬Long(和我認爲的BigInteger)。數學運算速度較慢,因爲它不能只使用本地JS操作,但沒有硬性限制。

因此,GWT已經實現瞭解決方法,它是內置的。當您需要一個大整數時,您只需避免傳遞數字JSON。

+0

但是,我試圖在一個密碼系統的實現中使用BigIntegers,但它失敗了。但是,對於標準Java,同樣的實現工作正常。 – xtremebytes 2012-08-03 13:44:52

+0

「失敗」,我的意思是:例如,它停在密鑰生成階段。它只花了很長時間來計算大質數,最終Javascript停止了響應。事實上,即使使用128位公鑰密碼系統,也失敗了。我注意到GWT支持BigInteger,所以我認爲我可以和他們合作,但我不能。 – xtremebytes 2012-08-03 13:49:58

+1

這是一個不適合JavaScript的任務。它失敗了,因爲它處理大量數據的速度非常慢,而且您在大量大量數據上進行了大量操作。 – 2012-08-03 16:08:40