155 votes

Pourquoi la division entière en c# retourne un entier, mais pas un float?

Personne ne sait pourquoi la division entière en c# retourne un entier, mais pas un float? Quelle est l'idée derrière (est-il seulement un héritage de C/C++)?

En C#:

float x = 13 / 4;   
//imagine I used have overridden == operator here to use epsilon compare
if (x == 3.0)
   print 'Hello world';

Le résultat de ce code serait:

'Hello world'

Strictement parlant, il n'y a pas une telle chose comme un entier de la division (la division est, par définition, une opération qui produit un nombre rationnel, les entiers sont dans un très petit sous-ensemble de ce qui.)

116voto

Servy Points 93720

Alors qu'il est commun pour les nouvelles programmeur de faire cette erreur de l'exécution de division entière quand il s'agit d'utiliser de virgule flottante de la division, dans la pratique, une division entière est une opération très courante. Si vous êtes en supposant que les gens utilisent rarement, et que chaque fois que vous faites la division, vous aurez toujours besoin d'avoir à vous rappeler de le cast de floating points, vous vous trompez.

Tout d'abord, la division entière est un peu plus rapide, donc si vous avez seulement besoin d'un nombre entier, donc, on voudrait utiliser l'algorithme plus efficace.

Deuxièmement, il y a un certain nombre d'algorithmes qui utilisent division entière, et si le résultat de la division est toujours un nombre à virgule flottante, vous seriez obligé d'arrondir le résultat à chaque fois. Un exemple du haut de ma tête est en train de changer la base d'un nombre. Le calcul de chaque chiffre implique la division entière d'un nombre avec le reste, plutôt que de le floating point de la division du nombre.

En raison de ces (et autres) des raisons, de la division entière de résultats en un entier. Si vous voulez obtenir le floating point de la division de deux entiers vous aurez juste besoin de se rappeler de voter une à une double/float/decimal.

81voto

Sergey Berezovskiy Points 102044

Voir C# spécification. Il existe trois types de la division opérateurs

  • Division entière
  • Division flottante
  • Division décimale

Dans votre cas, nous avons division entière, avec les règles suivantes sont appliquées:

La division arrondit le résultat à zéro, et la valeur absolue de le résultat est le plus grand entier qui est moins que le valeur absolue du quotient des deux opérandes. Le résultat est zéro positive ou lorsque les deux opérandes ont le même signe et de zéro ou négatif lorsque les deux opérandes ont des signes opposés.

Je pense que la raison pour laquelle C# utiliser ce type de division de nombres entiers (certaines langues de retour flottant résultat) est le matériel de la division de nombres entiers est plus rapide et plus simple.

44voto

Steven Doggart Points 22763

Chaque type de données est capable de surcharge de chaque opérateur. Si le numérateur et le dénominateur sont des nombres entiers, le type entier va effectuer l'opération de division et il sera de retour un type entier. Si vous voulez floating point de la division, vous devez jeter une ou plusieurs des nombre à virgule flottante types avant de les diviser. Par exemple:

int x = 13;
int y = 4;
float x = (float)y / (float)z;

ou, si vous êtes à l'aide de littéraux:

float x = 13f / 4f;

Gardez à l'esprit, floating points ne sont pas précis. Si vous vous souciez de précision, utilisez quelque chose comme le type décimal, à la place.

12voto

CodeCaster Points 38181

Puisque vous ne l'utilisez pas tous les suffixes, les littéraux 13 et 4 sont interprétés comme un entier:

Manuel:

Si la traduction littérale n'a pas de suffixe, il a la première de ces types dans lequel sa valeur peut être représentée: int, uint, long, ulong.

Ainsi, puisque vous déclarez 13 comme integer, integer division sera effectuée:

Manuel:

Pour une opération de la forme x / y, opérateur binaire résolution de surcharge est appliquée pour sélectionner un opérateur spécifique de mise en œuvre. Les opérandes sont convertis en types de paramètre de l'opérateur et le type du résultat est le type de retour de l'opérateur.

Les prédéfinis de la division opérateurs sont énumérés ci-dessous. Les opérateurs de calculer le quotient de x et y.

Division entière:

int operator /(int x, int y);
uint operator /(uint x, uint y);
long operator /(long x, long y);
ulong operator /(ulong x, ulong y);

Et donc, en arrondissant se produit:

La division arrondit le résultat à zéro, et la valeur absolue du résultat est le plus grand entier qui est inférieur à la valeur absolue du quotient des deux opérandes. Le résultat est nul ou positif lorsque les deux opérandes ont le même signe et de zéro ou négative, lorsque les deux opérandes ont des signes opposés.

Si vous procédez de la manière suivante:

int x = 13f / 4f;

Vous recevrez une erreur de compilation, depuis une division flottante ( / opérateur de 13f) résultats dans un flotteur, qui ne peut pas être converti en int implicitement.

Si vous voulez la division à virgule flottante de la division, vous aurez à faire le résultat d'un flotteur:

float x = 13 / 4;

Notez que vous aurez encore à diviser des nombres entiers, qui va être implicitement exprimées à flotteur: le résultat sera 3.0. De déclarer explicitement les opérandes comme le flotteur, à l'aide de l' f suffixe (13f, 4f).

9voto

L. Monty Points 335

C'est juste une opération de base. N'oubliez pas de l'école de base lorsque vous avez appris à diviser.
Au début, nous avons résolu 9/6 = 1 with remainder 3. Cette représentation peut être utile de temps à autre. L' /-opérateur en combinaison avec l' %-opérateur sont utilisés pour récupérer les résultats de recherche des valeurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X