格式化单一和最佳的最佳方式double值作为SimpleDB的字符串?

时间:2009-03-27 23:07:52

标签: c# amazon-simpledb

亚马逊的SimpleDB将值存储为字符串,我需要存储数值,以便它们仍能正确比较,例如:

“0001”< “0002”

我认为字节,整数和小数将相当简单,但我对处理单打和双打的最佳方法有点不确定,因为它们可能非常小或很大,并且会欣赏那些比聪明的人更聪明的建议我!

(我正在使用C#)

2 个答案:

答案 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的操作,但需要使用括号(例如[]表示正数,()表示负数)以及尾数。

如果你想能够用你的单曲等对整数进行排序。你可能应该将所有内容归一化到最大的类型(例如你的双打),而不是试图变得太棘手。

因此:

  • 7 - &gt; [100,17.0]
  • 0.1 - > [099,11.0]
  • -2 - &gt; (100,08.0)

等等。