如何在没有外部库的任何 lua 中将 double 转换为小字符串表示而不丢失数据?

How to convert a double to a small string representation without data loss in any lua without external libs?

我想仅使用任何 Lua 版本将数字转换为字符串,以便

我不关心

我尝试了内置的 tonumber 函数,但它并不总是给出正确的结果:

> print((2+256^6)==(1+256^6))
false
> print(tostring(2+256^6)==tostring(1+256^6))
true

这包括一个 number_to_str 和一个 number_from_str 函数:

https://github.com/bakpakin/binser/blob/master/binser.lua

显然,它们的能力超过 Lua 的内置数字...

如果您可以使用标准 Lua 库,试试这些:

x=math.pi

s=string.pack("d",x)
y=string.unpack("d",s)
print(x==y)

s=string.format("%a",x)
y=tonumber(s)
print(x==y)

string.format("%a",x) 在 Lua 5.2+ 中可用。 string.pack 在 Lua 5.3+ 中可用。

   -- Encoding/decoding without data loss

   local NaN_serialized = {
      [string.format('%.17g',   1/0 )] =  '1/0',
      [string.format('%.17g',  -1/0 )] = '-1/0',
      [string.format('%.17g',   0/0 )] =  '0/0',
      [string.format('%.17g', -(0/0))] =  '-(0/0)'
   }
   -- How to encode:
   str_value = string.format('%.17g', num_value):gsub('^.*', NaN_serialized):gsub(',', '.')

   -- How_to_decode:
   num_value = loadstring("return "..str_value)()