2010-11-12 20 views
9

J'ai un système de gestion de documents où les documents peuvent avoir plusieurs versions. Chaque version est enregistrée et les utilisateurs peuvent voir l'historique des versions.Version Numéros flottants, décimaux ou doubles

Ce que je voudrais savoir est: Quel type de données devrais-je utiliser pour les numéros de version? Décimal, Float ou Double? J'utilise .NET et C#.

Les numéros de version commencent à 0,1 et chaque publication version majeure sera arrondi au nombre entier supérieur. à savoir 0,4 va 1,0 et 1.3 va à 2.0 etc.

Lorsqu'un numéro de version frappe 0,9 et version mineure est ajouté, je voudrais que le nombre d'aller à 0,10 pas 1,0, quand j'ajoute. C'est le plus gros problème.

Toutes les suggestions sont appréciées.

Merci.

Répondre

17

System.Version

Ce stocke déjà les différentes parties, traite de présenter comme une chaîne (révision et les composants sont seulement utilisé dans l'affichage si elles sont non-nulles, donc leur importance pour votre cas n'a pas d'importance) et (le meilleur de tous) est déjà compris par d'autres développeurs .NET, et ne conduira pas à la confusion (si j'en ai vu d'un numéro de version qui n'était pas System.Version Je passerais du temps à essayer de comprendre pourquoi Version n'était pas assez bon pour le travail, au cas où cela se révélerait important et cacherait une mauvaise surprise. Si c'était assez bon pour le travail, je serais irrité que le développeur gaspille mon temps comme ça).

Vous pouvez traiter avec les moyens que vous voulez pour incrémenter facilement avec les méthodes d'extension:

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

Vous ne savez pas pourquoi votre solution est si faible. À mon avis, nous devrions toujours utiliser les implémentations existantes lorsque cela est possible. –

+1

J'adorerais vous donner un upvote, mais j'ai utilisé mon quota pour la journée, donc je dois revenir et ajouter un upvote demain. Clairement la meilleure réponse ici. –

+0

Au moins bon que l'OP a changé la coche de ma réponse à Jon Hanna à sa réponse est indiquée en haut. –

5

Que diriez-vous de deux entiers? Un pour les révisions majeures et un pour les révisions mineures?

+0

Bien sûr! Merci. – Jamie

1

Je suggère deux nombres entiers: un majeur et un mineur. Vous pouvez même stocker cela comme major * 1000 + minor si vous voulez une variable.

1

La valeur décimale devrait être la meilleure de ce qui est indiqué ci-dessus, mais comme d'autres l'ont noté, deux valeurs seraient meilleures.

Doubles et flotteurs ne stocke pas avec précision toutes les valeurs décimales, vous ne voulez pas que votre version à coup 1,219999999999999999

+5

Et quand vous ajoutez '0.1' à' 0.9', vous n'obtiendrez pas '0.10', car l'OP voulait ... – Oded

2

Faites votre propre type de données pour cette

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

Vous pouvez également ajouter un comparateur Ainsi, vous pouvez vérifier deux numéros de version pour voir lequel est la version la plus élevée de deux numéros de version par exemple.

EDIT

Ajouté la logique de comparateur aussi pour une bonne mesure :)

+0

Enfin, j'ai une raison d'utiliser une structure. Merci. – Jamie

+5

'System.Version' le fait déjà. –

+0

J'aimerais pouvoir répondre à nouveau à Jon Hanna. Ne pas réinventer la roue – Kell