【问题标题】:Version Numbers float, decimal or double版本号 float、decimal 或 double
【发布时间】:2011-05-09 02:07:16
【问题描述】:

我有一个文档管理系统,其中的文档可以有多个版本。每个版本都已保存,用户可以查看版本历史记录。

我想知道的是:版本号应该使用什么数据类型?小数、浮点数还是双精度数?我使用的是 .NET 和 C#。

版本号从 0.1 开始,每个发布的主要 版本都将四舍五入到下一个整数。即 0.4 转到 1.01.3 转到 2.0 等等。

当版本号达到 0.9 并添加 次要 版本时,我希望数字变为 0.10 而不是 1.0 ,当我添加它时。这是最大的问题。

欢迎提出任何建议。

谢谢。

【问题讨论】:

    标签: c# .net version-control document-management


    【解决方案1】:

    System.Version

    这已经存储了不同的部分,处理将其呈现为字符串(修订和构建组件仅在它们不为零时用于显示,因此它们与您的情况无关)和(最重要的是) 已经被其他 .NET 开发人员理解,并且不会导致混淆(如果我看到一些不是 System.Version 的版本号的使用,我会花一些时间尝试找出为什么 Version对这份工作来说不够好,以防万一这被证明很重要并隐藏了一个令人讨厌的惊喜。如果它对这份工作来说足够好,我会对开发人员这样浪费我的时间感到恼火)。

    您可以使用扩展方法轻松处理您想要递增的方法:

    public static Version IncrementMajor(this Version ver)
    {
      return new Version(ver.Major + 1, 0);
    }
    public static Version IncrementMinor(this Version ver)
    {
      return new Version(ver.Major, ver.Minor + 1);
    }
    

    【讨论】:

    • 不确定为什么您的解决方案得分如此之低。在我看来,我们应该尽可能使用现有的实现。
    • 我很想给他一个赞成票,但是我已经用完了我当天的配额,所以我必须明天回来添加一个赞成票。显然这里是最好的答案。
    • OP 将复选标记从我对 Jon Hanna 的回答更改为他的回答显示在顶部,这至少很好。
    • 什么ver.Minor是最大值?
    • @Evgeny,你的意思是当你打电话给IncrementMinor 时,如果ver.Minor 设置为int.MaxValue 会发生什么?根据checkedunchecked 上下文,您可能会收到溢出错误,或者会更改为int.MinValue。这将使编译上述checked(默认值)以确保发生异常,这是个好主意。
    【解决方案2】:

    两个整数怎么样?一份主要修订,一份次要修订?

    【讨论】:

      【解决方案3】:

      为此创建自己的数据类型

      public struct VersionNumber : IComparable<ReleaseNumber>
      {
        public int MajorVersion{get;set;}
        public int MinorVersion{get;set;}
      
        public VersionNumber( int major, int minor)
        {
          MajorVersion = major;
          MinorVersion = minor;
        }
      
        public override string ToString(){
          return major + '.' + minor;
        }
      
        public int CompareTo(VersionNumber other) {
          int result;
          result = MajorVersion.CompareTo(other.MajorVersion);
          if (result != 0) { return result; }
          return MinorVersion.CompareTo(other.MinorVersion);
        }
        public static bool operator <(VersionNumber left, VersionNumber right) {
          return left.CompareTo(right) < 0;
        }
        public static bool operator <=(VersionNumber left, VersionNumber right) {
          return left.CompareTo(right) <= 0;
        }
        public static bool operator >(VersionNumber left, VersionNumber right) {
          return left.CompareTo(right) > 0;
        }
        public static bool operator >=(VersionNumber left, VersionNumber right) {
          return left.CompareTo(right) >= 0;
        }
      }
      

      您还可以添加一个比较器,以便检查两个版本号,例如查看哪个版本号是两个版本号中的最高版本。

      编辑

      添加了比较器逻辑也可以很好地衡量:)

      【讨论】:

      • 最后,我有理由使用结构体。谢谢。
      • 我希望我能再次 +Jon Hanna 的回答。不要重新发明轮子
      • 我不知道 System.Version 类,所以我也在这里学到了一些东西。我没有故意重新发明轮子。我只是不知道轮子已经存在:)
      【解决方案4】:

      我建议使用两个整数:一个主要的和一个次要的。如果您想要一个变量,您甚至可以将其存储为 major * 1000 + minor

      【讨论】:

        【解决方案5】:

        十进制应该是上面给出的最好的,但正如其他人指出的那样,两个整数会更好。

        双精度和浮点数并不能准确存储所有十进制值,您不希望您的版本突然变为 1.219999999999999999

        【讨论】:

          猜你喜欢
          • 2013-01-04
          • 2017-02-12
          • 1970-01-01
          • 2014-07-23
          • 1970-01-01
          • 1970-01-01
          • 2021-05-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多