0

我已经说过 value 0.36388617850285954,当我使用 Javascript.toString(36)函数时,我得到了"0.d3lh1pogpwk".我想在 golang 中复制它的输出,但是我没有真正的起点。

我将如何执行此操作?

4

1 回答 1

3

Go base36 包不能正确转换它,因为 JavascripttoString(36)没有对 float64 进行 base36 编码,它使用 36 的基数表示它。关于这个函数如何处理Number对象(并且只有数字对象)的细节,文档缺乏光泽,并且逻辑也很奇怪,但位于此处:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toString#Description

基本上,在非整数的情况下,通过将小数左侧的转换与点连接起来,将值转换为 baseN 中的数字(其中 N 是传入的基数),然后转换为小数点的右边。例如

baseNLeft + "." + baseNRight

上面的文档链接中还解释了有关负面因素的其他注意事项。具体来说,它们保留负数并简单地转换数字然后替换负号而不是使用二进制补码表示。

在我看来,这个功能不适合 JavaScript 本身以外的任何其他语言,我建议在跨语言使用它时要谨慎。

至于你将如何在 Go 中做到这一点的问题本身的回答。遵循相同的愚蠢语义并针对数十万个测试用例对其进行单元测试,f(x) = y以在 Javascript 和您的 Go 实现中检查这一点。逻辑的实际规范在此处的 ECMA 规范中:https ://www.ecma-international.org/ecma-262/6.0/#sec-tostring-applied-to-the-number-type

注意:在 Go 中实现了一个名为otto(github.com/robertkrimen/otto) 的 Javascript 引擎,但它不能正确执行该Number.toString(radix)功能。另外,如果这只是它的唯一目的,那么它是一个需要导入的繁重库。

于 2018-09-26T18:41:42.327 回答