【问题标题】:How do I convert a Float64 to Base36 in Go?如何在 Go 中将 Float64 转换为 Base36?
【发布时间】:2018-09-26 18:15:57
【问题描述】:

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

我将如何执行此操作?

【问题讨论】:

  • 开箱即用我认为 Go 不支持这种格式。但是,如果您还没有遇到这个包,请查看 github.com/martinlindhe/base36。
  • @reticenroot 我已经尝试了所有可用的base36转换包,不幸的是它们没有正确输出。
  • 另外base36包只接受uint64作为参数。
  • 顺便说一句:你的号码不能完全用base 36表示,JS结果不完整,更多的数字是0.d3lh1pogpwkf75gi0nweot08s8j4vucdfv5a335rdgxasxi02yvn0vp9d6o...

标签: go floating-point base base36


【解决方案1】:

Go base36 包不能正确转换它,因为 Javascript 的 toString(36) 没有对 float64 进行 base36 编码,它使用 36 的基数表示它。关于此函数如何在 @987654324 上工作的细节的文档乏善可陈@objects(并且只有number个objects),逻辑也很诡异,不过位于: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 引擎,但它没有正确执行 @987654328 @ 功能。另外,如果这只是它的唯一目的,那么它是一个需要导入的繁重库。

【讨论】:

    猜你喜欢
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 2015-04-01
    • 1970-01-01
    • 2018-03-19
    • 2016-10-12
    • 1970-01-01
    相关资源
    最近更新 更多