代码之家  ›  专栏  ›  技术社区  ›  anchandra

确定十进制数是否可以存储为int32

  •  4
  • anchandra  · 技术社区  · 16 年前

    我正在做一些自定义序列化,为了节省一些空间,我想将小数序列化为int,如果可能的话。性能是一个问题,因为我处理的数据量很大。我目前使用的方法是:

    if ((value > Int32.MinValue) && (value < Int32.MaxValue) && ((valueAsInt = Decimal.ToInt32(value)) == value))
    {
        return true;
    }
    

    6 回复  |  直到 16 年前
        1
  •  1
  •   Nelson Rothermel    16 年前

    有负值吗?我猜是的,因为你有最小值检查,否则你可以跳过它。您甚至可以使用无符号int,这将允许您将更多的双精度值转换为int。

    编辑: 另外,如果你有更多的正数,你可以交换前两个条件。这样一来,第一个最有可能失败,减少了比较的总数。

        2
  •  1
  •   Tejs    16 年前

    您的失效标准是:

    2) 它比MinValue小吗?

    听起来好像你已经把它们盖好了。我的实施方案是:

    public bool IsConvertibleToInt(decimal value)
    {
        if(value > int.MaxValue)
           return false;
    
        if(value < int.MinValue)
           return false;
    
        if(Math.Floor(value) < value && Math.Ceiling(value) > value)
           return false;
    
        return true;
    }
    
        3
  •  1
  •   Seth Moore    16 年前

    这个怎么样。我认为应该减少操作(至少减少比较次数):

        return (value == (Int32)value);
    

    if 语句只返回一个布尔值,您只需返回比较。仅此一点就可以使它更快(除非编译器已经为此进行了优化)。如果必须使用If语句,可以类似地执行以下操作:

        if (value == (Int32)value)
        {
            //Do stuff...
        return true;
        }
        else
        {
            //Do stuff...
            return false;
        }
    

    编辑:

        4
  •  1
  •   Nate Zaugg    16 年前

    这取决于你有多少小数位或者你真正关心的小数位。如果您可以说我只关心最多3位小数,那么您可以在int32中存储的最大数字是int.MaxValue/1000。如果您只使用正数,那么您可以使用uint获得更高的数字。在任何情况下,这样做的方法都是一致地为十进制保留空间,并使用*1000对它们进行编码,使用/1000将它们解码成十进制。

        5
  •  0
  •   balazs    16 年前

    不需要“valueAsInt=”。我相信(Decimal.ToInt32(value)==value))只需少一次赋值就可以得到相同的结果。您是否使用valueAsInt作为某种输出参数?

        6
  •  0
  •   Kitsune SpiderShlong    16 年前

    难道你就不能这样做:

    if(Decimal.ToInt32(value) == value)
    {
         return true;
    }
    

    不是.net专家,但我认为这应该是它所需要的。此外,两个比较运算符应为“或相等”,因为最小值/最大值也是有效的。

    推荐文章