亚马逊的SimpleDB将值存储为字符串,我需要存储数值,以便它们仍能正确比较,例如:
“0001”< “0002”
我认为字节,整数和小数将相当简单,但我对处理单打和双打的最佳方法有点不确定,因为它们可能非常小或很大,并且会欣赏那些比聪明的人更聪明的建议我!
(我正在使用C#)
答案 0 :(得分:1)
如果您已经有办法表示符号幅度数字(例如您所说的integers
不会太难),那么您已经在那里; - ]
来自Comparing Floating Point Numbers
IEEE浮点数和双精度格式 设计的数字是这样的 “按字典顺序排列”,其中 - 用IEEE建筑师威廉的话说 Kahan的意思是“如果两个浮点数 订购相同格式的数字 (比如x< y),然后他们被命令 他们的位是一样的 重新解释为Sign-Magnitude 整数“。强>
static public string DoubleToSortableString(double dbl)
{
Int64 interpretAsLong =
BitConverter.ToInt64(BitConverter.GetBytes(dbl), 0);
return LongToSortableString(interpretAsLong);
}
static public double DoubleFromSortableString(string str)
{
Int64 interpretAsLong =
LongFromSortableString(str);
return BitConverter.ToDouble(BitConverter.GetBytes(interpretAsLong), 0);
}
static public string LongToSortableString(long lng)
{
if (lng < 0)
return "-" + (~lng).ToString("X16");
else
return "0" + lng.ToString("X16");
}
static public long LongFromSortableString(string str)
{
if (str.StartsWith("-"))
return ~long.Parse(str.Substring(1, 16), NumberStyles.HexNumber);
else
return long.Parse(str.Substring(1, 16), NumberStyles.HexNumber);
}
-0010000000000000 => -1.79769313486232E+308 -3F0795FFFFFFFFFF => -100000 -3F3C77FFFFFFFFFF => -10000 -3F70BFFFFFFFFFFF => -1000 -3FA6FFFFFFFFFFFF => -100 -3FDBFFFFFFFFFFFF => -10 -400FFFFFFFFFFFFF => -1 00000000000000000 => 0 03FF0000000000000 => 1 04024000000000000 => 10 04059000000000000 => 100 0408F400000000000 => 1000 040C3880000000000 => 10000 040F86A0000000000 => 100000 07FEFFFFFFFFFFFFF => 1.79769313486232E+308
答案 1 :(得分:0)
一个选项(如果你不要求它们是人类可读的)将首先存储指数(零填充),然后存储尾数。像“(07:4.5)那样通常写成4.5e7。
*
微笑*
您是要处理签名值还是小于1的正浮点数?如果是这样,您还需要执行类似offsets的操作,但需要使用括号(例如[]表示正数,()表示负数)以及尾数。
如果你想能够用你的单曲等对整数进行排序。你可能应该将所有内容归一化到最大的类型(例如你的双打),而不是试图变得太棘手。
因此:
等等。