9
votes

Utilisation du type de données numérique droit

Après devenus de plus en plus engagés dans la formation de nouveaux ingénieurs ainsi que la lecture Présentation Deviads de Jon Skeet J'ai commencé à reconnaître que de nombreux ingénieurs ne sont pas clairs pour utiliser quels types de données numériques lorsque. J'apprécie le rôle qu'un diplôme d'informatique formel joue dans cet établissement, mais je vois beaucoup de nouveaux ingénieurs montrant une incertitude car ils n'ont jamais travaillé avec de grands ensembles de données, ni des logiciels financiers, ni de programmation de phyiscs ou de problèmes de statistiques, ou de problèmes de données de données complexes. .

Mon expérience est que les gens grokent vraiment des concepts lorsqu'ils sont expliqués dans un contexte. Je cherche de bons exemples de problèmes de programmation réels où certaines données sont mieux représentées à l'aide de type de données. Essayez de rester à l'écart des exemples de manuels si possible. Je marquais cela avec Java, mais n'hésitez pas à donner des exemples dans d'autres langues et de retag:

Entier, long, double, flotteur, biginteger, etc ...


0 commentaires

5 Réponses :


4
votes

BigDecimal est le meilleur lorsqu'il s'agit de maintenir des calculs de points flottants précis et de pouvoir spécifier la précision souhaitée. Je crois que le float (et dans une certaine mesure) offrent des avantages de performance sur BigDecimal, mais au coût de la précision et de la convivialité.


0 commentaires

28
votes

Je ne pense vraiment pas que vous avez besoin d'exemples ou de quelque chose de complexe. C'est simple:

  • Est-ce un nombre entier?
    • peut-il être> 2 ^ 63? Biginteger
    • peut-il être> 2 ^ 31? long
    • sinon int
    • Est-ce un nombre décimal?
      • est une valeur approximative ok?
        • Double
        • Cela doit-il être exact? (Exemple: Montants monétaires!)
          • BigDecimal

            (quand je dis ">", je veux dire "plus grand en valeur absolue", bien sûr.)

            Je n'ai jamais utilisé d'octets ni de caractères pour représenter un nombre, et je n'ai jamais utilisé de courte période. C'est en 12 ans de programmation Java. Flotter? Meh. Si vous avez un énorme tableau et que vous rencontrez des problèmes de mémoire, je suppose.

            Notez que BigDecimal est un peu surmonté; Vos valeurs font pas doivent être grandes du tout pour en avoir besoin.


2 commentaires

J'aime vraiment la façon dont tu l'as cassé. 100% d'accord avec vous sur le char, court et flotte avec Java.


Un indice supplémentaire: s'il s'agit d'un nombre décimal et qu'il doit être exact, mais le nombre maximum de décimales est connu à l'avance (par exemple avec des valeurs de dollars: 2 déc. Lieux), vous pouvez simplement utiliser int / long, et Divisez sur la sortie.That évite les problèmes de BitDecimal (performances, opérateurs maladroits).



1
votes

normalement numérique si nous parlons que la taille de type de données Indevendenat (32/64bit) est comme ci-dessous,

Entier: 4 octets

long: 8 octets

Décimal / Float: 4Bytes

Double: 8Bytes

et les tailles réduites à la moitié pour les valeurs signées (par exemple: pour 4Bans, non signé = 4billions, signés = 2billions)

Bigint (dépend de la mise en œuvre du langage) parfois jusqu'à 10bytes.

Pour l'archivage des données de haute volume (telle que le moteur de recherche), je serais fortement recommandé d'octet et court pour économiser des espaces.

octet: 1 octet, (0-256 non signé, -128 - 128 signé)

Short: 2 octets (65k non signés)


Disons que vous souhaitiez enregistrer enregistrer un enregistrement sur l'âge, car personne ne vit jamais plus de 150, vous avez donc utilisé l'octet de type de données (lu ci-dessus pour la taille), mais si vous utilisez l'entier, vous avez déjà gaspillé de 3bytes supplémentaires et me dis sérieusement que vous vivez plus de 4billions YRS.


4 commentaires

Exemple classique d'optimisation prématurée ... À moins que vous économisiez un énorme tableau ou une base de données des Âges des peuples, utilisez Int. Il n'y a pas d'inconvénient si la taille n'est pas un problème (et dans la plupart des cas modernes, ce n'est pas) et l'avantage est que vous n'êtes pas tombé prier de bugs stupides comme le bug y2k en raison de l'optimisation prématurée.


Je parlais d'âge, pas de date de naissance lol. Prenez ALOOK à Topics J'ai créé, j'ai développé un moteur de recherche sur la balance Web personnalisé (format d'index hautement optimisé sur mesure) pendant près de 2 ans et que fiduciez Me Web Index est une grosse affaire lors de l'optimisation de l'espace disque. Et j'utilise à la fois Int (32) et Long (64) à la date pour économiser de l'espace et éviter les limites de Y2K.


Aussi simplement FYI Sawas, nous conservons certaines de nos données en 3bytes et à 5 octets, chargez-vous dans un espace mémoire dans la normale 4 / 8.bytes pour une efficacité maximale de l'espace au lieu de Vint (Lucene) pour une vitesse supplémentaire lors du chargement. Alors oui, je sais ce que je parle.


Il est utile de noter que l'architecture de bas niveau peut parfois entraîner un Int étant plus rapide à traiter qu'un octet. Pour un exemple plus extrême, Bitfields - (bool) FOO utilise moins d'instructions de code de machine que (bool) FOO & 0X08 . Comme toujours, il faut être attentif à des compromis de l'espace temporel (la situation de KAR étant une personne dans laquelle elle a probablement été déjà considérée comme déjà).



4
votes

Un point important que vous voudrez peut-être articuler est que c'est presque toujours une erreur de comparer les numéros de points flottants pour l'égalité. Par exemple, le code suivant est très susceptible d'échouer:

double euros = convertToEuros(item.getCostInDollars());
if (Math.abs(euros - 10.0) < EPSILON) {
  // this might work
}


4 commentaires

Je ne suis pas un gros fan de votre code exemple, car vous ne devriez pas utiliser le double pour les données monétaires pour commencer. Vous devriez utiliser BigDecimal. Voir par exemple Ceci: Stackoverflow.com/Questtions/965831/... et point 48 dans le livre efficace Java (2e ed).


Jonik - Il nous montre pourquoi le double est mauvais. Et il dit: "Voici comment le faire si vous devez absolument utiliser le point flottant". Il n'y a pas de faute ici.


BTW, je pense que c'est une excellente réponse, du moins aussi bonne que la mienne. La seule exception est que BigDecimal devrait vraiment être exhortée comme le seul moyen de gérer avec précision les nombres décimaux; Pas seulement "Oh, tu sais probablement ce que tu vas.".


Kevin - Eh bien, ouais, mais cela n'était pas terriblement dépassé de la réponse, surtout quand il n'y a pas de mot sur le fait que BigDecimal serait la bonne façon! De tels exemples seraient mieux servir d'appendice à par exemple. votre propre réponse qui énonce les règles de base de manière plus clairement plus clairement (alors que les électeurs sont d'accord)



1
votes

Vint à Lucene est le diable. Le petit avantage en taille est empilé énormément par la pénalité de la performance en les lisant d'octet-octet.

Une bonne chose à qui parler est l'espace par rapport à Time Trade off. Sauvegarde 200 Mo était géniale en 1996, mais en 2010, les tampons d'IO battant la lecture d'un octet à une époque est terrible.


0 commentaires