任意精度数字和 Javascript,Google Web Toolkit

Posted

技术标签:

【中文标题】任意精度数字和 Javascript,Google Web Toolkit【英文标题】:Arbitrary precision numbers and Javascript, Google Web Toolkit 【发布时间】:2012-08-03 03:13:50 【问题描述】:

这不是一个真正的问题,因为我确实有解决这个问题的办法,但我想我会让每个人都知道,因为它可能会对人们使用 Google Web Toolkit 的方式产生相当广泛的影响。

所以问题之一是Google gson 在 JSON 中表示数字的方式。例如,int myInt = 2 将变为 "myInt":2long myLong = 5432198765L 将变为 "myLong":5432198765BigInteger myBI = 1310381093810938109481049128409487109378109248104098130981039810983 将变为 "myBI":1310381093810938109481049128409487109378109248104098130981039810983。虽然 gson 本身可以毫无问题地反序列化它,但 JSON 格式的 GWT 2.4 中的 AutoBeans 框架不会喜欢它。 Issue 6331 为即将发布的 GWT 2.5 版本中的长表示修复了它。但是,issue 7555 将无法解析,因为 javascript 数字精度的工作方式。

因此,我们需要将 BigIntegers 表示为字符串,它会起作用,例如,String myBIStr = new BigInteger("1310381093810938109481049128409487109378109248104098130981039810983").toString() 将表示为 "myBIStr":"1310381093810938109481049128409487109378109248104098130981039810983"。在 GWT 端,这将产生一个 String,我们将不得不用它构建一个 BigInteger。

为什么 Google 不会解析 7555 完全有道理,但这让我想到了一个真正的悬而未决的问题:如何处理 Javascript 中的高精度数字?

一般来说,如果基于 Web 的 Javascript 和 Google Web Toolkit 前端要挑战原生前端,那么我们可能会使用任意精度数字,而不是受限于大约 53 位精度comment 3 谈到的。更糟糕的是,这个限制不也影响 node.js 或任何其他服务器端 Javascript 吗?

有什么好的解决方法,尤其是使用 Google Web Toolkit 或与 Google Web Toolkit 无缝协作的解决方法?

【问题讨论】:

【参考方案1】:

GWT 可以对大于 53 位的整数进行数学运算,因为它模拟了 Long(我认为是 BigInteger)。数学比较慢,因为它不能只使用原生 JS 操作,但没有硬性限制。

所以,GWT 已经实现了解决方法,并且它是内置的。当您需要一个大整数时,您只需要避免传递数字 JSON。

【讨论】:

但是,我尝试在密码系统的实现中使用 BigIntegers,但它失败了。不过,相同的实现在标准 Java 上也能正常工作。 “失败”是指:例如,它在密钥生成阶段停止。计算大素数只需要很长时间,最终 Javascript 停止响应。事实上,即使使用 128 位公钥密码系统,它也失败了。我注意到 GWT 支持 BigInteger,所以我认为我可以使用它们但我不能。 这对于 javascript 来说是不合适的任务。它失败了,因为处理大数非常慢,而且您正在对大量大数进行大量操作。 斯坦福的 JSBN 库为 Javascript 实现了足够优化的大数字。这是一个使用它的示例密码系统:bitpuzzle.com/tmp/47252cb0ddcaa147/commit/demo/…。我想知道为什么没有在 GWT 中添加 JSBN 优化。

以上是关于任意精度数字和 Javascript,Google Web Toolkit的主要内容,如果未能解决你的问题,请参考以下文章

用于任意数字精度的 .NET Framework 库

PHP BC 数学 函数

C#将数字四舍五入为双精度数的任意数字[重复]

任意精度算术说明

任意精度算术说明

PHP 精准加减乘除