Est-ce que quelqu'un sait pourquoi la division entière en C # renvoie un entier et non un flottant? Quelle est l'idée derrière cela? (Est-ce seulement un héritage de C / C ++?)
En C #:
float x = 13 / 4;
//== operator is overridden here to use epsilon compare
if (x == 3.0)
print 'Hello world';
Le résultat de ce code serait:
'Hello world'
À proprement parler, il n'y a pas de division entière (la division par définition est une opération qui produit un nombre rationnel, les entiers en étant un très petit sous-ensemble).
integer
division pasfloating point
division.Réponses:
Bien qu'il soit courant pour les nouveaux programmeurs de commettre cette erreur en effectuant une division entière alors qu'ils voulaient réellement utiliser la division en virgule flottante, en pratique, la division entière est une opération très courante. Si vous supposez que les gens l'utilisent rarement et que chaque fois que vous effectuez une division, vous devez toujours vous rappeler de lancer des virgules flottantes, vous vous trompez.
Tout d'abord, la division entière est un peu plus rapide, donc si vous n'avez besoin que d'un résultat entier, vous voudrez utiliser l'algorithme le plus efficace.
Deuxièmement, il existe un certain nombre d'algorithmes qui utilisent la division entière, et si le résultat de la division était toujours un nombre à virgule flottante, vous seriez obligé d'arrondir le résultat à chaque fois. Un exemple du haut de ma tête est 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 la division en virgule flottante du nombre.
Pour ces raisons (et pour d'autres), la division entière donne un entier. Si vous voulez obtenir la division en virgule flottante de deux entiers, vous devrez simplement vous rappeler d'en convertir un en
double
/float
/decimal
.la source
/
opérateur effectuera une division entière ou en virgule flottante (sauf si vous utilisez dynamique). S'il est difficile pour vous de le comprendre parce que vous faites tant sur cette ligne un, alors je vous suggère de briser cette ligne en plusieurs lignes de sorte que son plus facile à comprendre si les opérandes sont des entiers ou des types de virgule flottante. Les futurs lecteurs de votre code l'apprécieront probablement.int/int
opérateur était tout simplement illégal [avec un diagnostic spécifiant que le code doit convertir un opérande ou utiliser le autre opérateur, selon le comportement souhaité]. Si une autre bonne séquence de jetons était disponible pour la division d'entiers, il serait peut-être possible de déconseiller l'utilisation de/
à cette fin, mais je ne sais pas ce qui serait pratique.Voir la spécification C # . Il existe trois types d'opérateurs de division
Dans votre cas, nous avons la division Integer, avec les règles suivantes appliquées:
Je pense que la raison pour laquelle C # utilise ce type de division pour les entiers (certains langages renvoient un résultat flottant) est matérielle - la division des entiers est plus rapide et plus simple.
la source
Chaque type de données est capable de surcharger chaque opérateur. Si le numérateur et le dénominateur sont des entiers, le type entier effectuera l'opération de division et retournera un type entier. Si vous souhaitez une division en virgule flottante, vous devez convertir un ou plusieurs nombres en types à virgule flottante avant de les diviser. Par exemple:
ou, si vous utilisez des littéraux:
Gardez à l'esprit que les points flottants ne sont pas précis. Si vous vous souciez de la précision, utilisez plutôt quelque chose comme le type décimal.
la source
Puisque vous n'utilisez aucun suffixe, les littéraux
13
et4
sont interprétés comme un entier:Ainsi, puisque vous déclarez
13
comme entier, la division entière sera effectuée:Et donc l'arrondissement se produit:
Si vous procédez comme suit:
Vous recevrez une erreur du compilateur, car une division en virgule flottante (l'
/
opérateur de13f
) entraîne un flottant, qui ne peut pas être converti implicitement en int.Si vous voulez que la division soit une division à virgule flottante, vous devrez faire du résultat un flottant:
Notez que vous diviserez toujours des entiers, qui seront implicitement convertis en float: le résultat sera
3.0
. Pour déclarer explicitement les opérandes comme float, en utilisant lef
suffixe (13f
,4f
).la source
1.0
.C'est juste une opération de base .
Souvenez-vous quand vous avez appris à diviser. Au début, nous avons résolu
9/6 = 1 with remainder 3
.L'opérateur / en combinaison avec l'opérateur% est utilisé pour récupérer ces valeurs.
la source
Cela pourrait être utile:
la source
2.5
, non2
.Le résultat sera toujours du type qui a la plus grande plage du numérateur et du dénominateur. Les exceptions sont byte et short, qui produisent int (Int32).
Il n'y a pas de conversion implicite entre les types à virgule flottante et le type décimal, donc la division entre eux n'est pas autorisée. Vous devez explicitement effectuer un cast et décider lequel vous voulez (Decimal a plus de précision et une plage plus petite que les types à virgule flottante).
la source