Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Serialization 在没有外部LIB的任何lua中,如何将双精度表示转换为小字符串表示而不丢失数据?_Serialization_Lua_Numbers_Tostring_Number Formatting - Fatal编程技术网

Serialization 在没有外部LIB的任何lua中,如何将双精度表示转换为小字符串表示而不丢失数据?

Serialization 在没有外部LIB的任何lua中,如何将双精度表示转换为小字符串表示而不丢失数据?,serialization,lua,numbers,tostring,number-formatting,Serialization,Lua,Numbers,Tostring,Number Formatting,我想只使用任何Lua版本将数字转换为字符串,以便 没有数据丢失(必要!) 字符串表示形式尽可能小(8字节就可以了)(可选,无需) 不使用外部LIB(必要!) 转换速度尽可能快(可选,无需) 我不在乎 人类可读性 避免特殊字符 我尝试了内置的tonumber函数,但它并不总是给出正确的结果: > print((2+256^6)==(1+256^6)) false > print(tostring(2+256^6)==tostring(1+256^6)) true 这包括一个数

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

  • 没有数据丢失(必要!)
  • 字符串表示形式尽可能小(8字节就可以了)(可选,无需)
  • 不使用外部LIB(必要!)
  • 转换速度尽可能快(可选,无需)
我不在乎

  • 人类可读性
  • 避免特殊字符
我尝试了内置的
tonumber
函数,但它并不总是给出正确的结果:

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

这包括一个数字\u至\u str和一个数字\u自\u str函数:


显然,它们比Lua的内置tonumber功能更强…

如果可以使用标准Lua LIB,请尝试以下方法:

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)
在Lua5.2+中提供
string.pack
在Lua 5.3+中可用。

浮点数的定义是有损的-如果你真的需要避免任何数据丢失,你不能使用浮点数开始。Lua有一个数字数据类型-这些数字是双倍的-我希望能够序列化它们,以便能够序列化除userdata和threads之外的任何数据…有人能发布一个完整的解决方案吗?所以不是一个提供完整解决方案的地方。你从哪里得到的?我看到许多像我这样的小问题的完整解决方案!我不认为将数字序列化是一门大科学。此外,如果只有错误的答案,那些将错误答案嵌入程序的人会遇到严重的问题!他们试图序列化一个nan,并想知道为什么在反序列化数据时得到零!打印(数字从数字到数字(-(0/0)),1)=-(0/0))为假。这并没有保留nan和-nan之间的差异,而且,这是相当多的代码。如果你用叉子做了一个能用的版本就可以了。如果不处理nan,你可以自己轻松地添加它。是的,但我不想检查代码页是否有进一步的错误,如果你这样做了,你会发现你的解决方案没有问题。我没有时间为你的
(-0/0)==(-0/0)
测试做SOA,没有“负nan”似乎比扭动好!如何反序列化?在任何lua版本中都有string.format吗?已经试用过了:yout不能使用tonumber反序列化(-)nans和(-)inf,但对于任何其他版本都可以。另外(关于string.format的内容除外)“选项a、a可能在Lua5.2和更高版本中可用。”(它应该适用于任何lua版本),string.pack根本不在我的lua中。“string.format(“%a”,x)在Lua 5.2+中可用。string.pack在Lua 5.3+中可用。“-无法解决问题。还支持NAN、INF和它们的负面版本。似乎可以工作(至少对于我目前使用的lua)。赞成:非常非常简短的解决方案,康特拉:字符串表示非常大。
   -- 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)()