【问题标题】:Lua string to number - do not use e notationLua 字符串转数字 - 不要使用 e 表示法
【发布时间】:2019-05-06 14:02:52
【问题描述】:

我有一个字符串代表一个大数字,不超过 19 位,例如“3435939477110523131”,我想将它从字符串转换为数字并转换回来。 但是当我使用 tonumber() 时,它会使用 E 表示法进行转换,这非常愚蠢。

Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> a = "3435939477110523131"
> print(tonumber(a))
3.4359394771105e+18

它丢失了一些数字。有没有办法不用 e 符号把它转换成一个完整的数字?

【问题讨论】:

  • Lua 5.1 数字为double(最大整数值为2^53,小于10^16),要准确打印它们请使用print(("%.f"):format(n))
  • Lua 5.3+ 整数最高可达2^63(19位)
  • lmapm,它支持任意精度的数字,如果你正在寻找的话。
  • @PaulKulchenko,如果只需要整数,也可以limath

标签: lua


【解决方案1】:

"3435939477110523131" 太大,无法准确存储在 lua 5.1 中

我们可以这样做:

local a = "3435939477110523131"
local ourNumber = tonumber(a)
local computersNumber = 3435939477110522900 --this is the number `a` ends up as.

print(ourNumber == computersNumber)

在 lua 5.1 中,这将打印为 true,您可以在 lua 5.1 中准确存储的最大整数是2^53 - 1,即9007199254740991


print 将尝试使用将其参数转换为字符串,对于一个数字,这会导致科学记数法,并且您不会捕获所有精度。

您可以通过使用 string.format 将值转换为打印字符串来防止这种情况

str = "3435939477110523131"
num = tonumber(str)

print(str, num, string.format("%.f",num))

在 5.3 版本中,如果您将 string.format"%.f" 一起使用,您将得到不正确的结果,请改用 tostring"%.i"

str = "3435939477110523131"
num = tonumber(str )

print(str, num, tostring(num), string.format("%.i",num), string.format("%.f",num))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-13
    • 2013-06-05
    • 2014-09-14
    • 2013-12-23
    • 1970-01-01
    • 2022-01-09
    • 2020-02-20
    • 1970-01-01
    相关资源
    最近更新 更多