我说过值0.36388617850285954
,当我使用Javascript .toString(36)
函数时,我得到了输出"0.d3lh1pogpwk".
,我想在golang中复制它,但是我没有真正的起点。
我将如何执行呢?
答案 0 :(得分:3)
Go base36软件包无法正确转换此代码,因为Javascript的toString(36)
不能对float64进行编码,它使用基数36来表示它。有关此函数的工作方式的详细说明,该文档很含糊Number
个对象(并且只有数字对象),逻辑也确实很奇怪,但是位于此处:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toString#Description
基本上,在非整数的情况下,通过将小数点左侧的转换与点连接起来,然后将其转换为以baseN为单位的数字(其中N是传入的基数)。小数点右边的转换。例如
baseNLeft + "." + baseNRight
上面的文档链接中还介绍了其他有关底片的注意事项。具体来说,它们保留负号,只需转换数字然后替换负号,而不使用二进制补码表示。
我认为,此功能不适合Javascript本身以外的任何其他语言,并且在跨语言使用时,建议您谨慎使用。
关于问题本身的答案,以及如何在Go中进行。遵循相同的愚蠢语义,并针对成千上万个测试案例进行单元测试,以检查Javascript和您的Go实现中的f(x) = y
。逻辑的实际规范在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)
功能。另外,如果这仅仅是一个目的,那么它就是一个繁重的库。