版本号浮点数、十进制或双精度

13

我有一个文档管理系统,其中文档可以有多个版本。每个版本都会被保存下来,并且用户可以查看版本历史。

我想知道的是:在.NET和C#中,我应该使用什么数据类型来表示版本号?Decimal、Float还是Double?

版本号从0.1开始,每次发布主要版本时,版本号将四舍五入为下一个整数。例如,0.4变成1.01.3变成2.0等。

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

欢迎提出任何建议。

谢谢。

5个回答

21

System.Version

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);
}

不确定为什么你的解决方案得分如此之低。在我看来,我们应该尽可能使用现有的实现。 - Gerald Davis
1
我很想给这个点赞,但是我今天的配额已经用完了,所以我明天再来点赞。显然这是最好的答案。 - Øyvind Bråthen
至少好的是,原帖作者将勾选标记从我的答案更改为Jon Hanna的答案,并显示在顶部。 - Øyvind Bråthen
最大值是什么ver.Minor? - Ievgen
@Evgeny,你是指如果在调用IncrementMinor时将ver.Minor设置为int.MaxValue会发生什么吗?这将取决于checkedunchecked上下文,你可能会收到溢出错误或它会更改为int.MinValue。编译以上代码时,将其设置为checked(默认值)以确保异常发生是个好主意。 - Jon Hanna

5

两个整数怎么样?一个用于主要修订版本,另一个用于次要修订版本?


2
为此,您可以创建自己的数据类型。
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;
  }
}

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

编辑

为了保险起见,也添加了比较器逻辑 :)


终于,我有理由使用结构体了。谢谢。 - Jamie
希望我能再次阅读Jon Hanna的答案。不要重复造轮子。 - Kell
1
我之前不知道有 System.Version 这个类,所以我也从中学到了东西。我并没有有意重新发明轮子,只是不知道这个轮子已经存在了 :) - Øyvind Bråthen

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

1

十进制应该是以上所述中最好的选择,但正如其他人指出的那样,两个整数可能更好。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接