J'ai une conversion simple d'un decimal
en C #. Cela ressemble à ceci:
private decimal BaseValue
{
get; set;
}
public decimal ConvertedValue
{
get
{
return BaseValue * (365 / 360);
}
}
Cependant, cela ne fonctionne pas. Je suppose que C # traite les nombres de la fraction sous forme d’entiers. Je peux donc faire comme ceci à la place (ce qui fonctionne):
public decimal ConvertedValue
{
get
{
return BaseValue * (decimal)((double)365 / (double)360);
}
}
Maintenant, cela semble un peu exagéré, mais je peux vivre avec ça. Ma question principale est la suivante:
Pourquoi Visual Studio m'avertit-il que 'la distribution est redondante' pour la distribution
(double)
? Et si je supprime la distribution(double)
, la distribution(decimal)
devient redondante. Et si je supprime cela, je suis de retour à la solution, qui ne fonctionne pas. Aidez-moi...?
La distribution decimal
est redondante, car le compilateur sait que vous voulez renvoyer une decimal
.
Un des deux conversions double
est redondant, car lorsque vous convertissez l'une des int
s en double
, il est clair que vous utilisez l'opérateur de division double
au lieu de division entière.
Mais il devrait suffire d’utiliser le suffixe littéral decimal
m
:
return BaseValue * (365m / 360);
Encore une fois, une m
est suffisante pour déduire l'opérateur correct.
Mais hé, BaseValue
est déjà decimal
et la parenthèse n’a pas de sens (si vous ne voulez pas une division entière) ... cela devrait fonctionner aussi:
return BaseValue * 365 / 360;
Il existe des suffixes pour certains types de nombres, par exemple:
// Use long suffix.
long l1 = 10000L;
// Use double suffix.
double d1 = 123.764D;
// Use float suffix.
float f1 = 100.50F;
// Use unsigned suffix.
uint u1 = 1000U;
// Use decimal suffix.
decimal m2 = 4000.1234M;
// Use unsigned suffix and long suffix.
ulong u2 = 10002000300040005000UL;
Les suffixes spécifient les types de nombre. Ils indiquent au compilateur C # qu’un littéral intégral tel que 1000 est considéré comme un certain type de nombre, par exemple un long (1000L). Nous examinons comment vous pouvez ajouter des suffixes numériques aux nombres.
Dans ton cas:
public decimal ConvertedValue
{
get
{
return BaseValue * (365 / 360M);
}
}
Et aussi sa plus claire lorsque vous utilisez un suffixe majuscule:
Suffixes minuscules. Vous pouvez également spécifier des suffixes minuscules, tels que u, l, ul, f, d et m. Mais il est plus facile de les confondre avec les chiffres. La lettre 'l' est parfois considérée comme le chiffre 1.
vous pouvez simplement ajouter un suffixe m à l'un des nombres pour le rendre décimal:
return BaseValue * (365 / 360m);
utilisez le suffixe m:
return 365m/360 * BaseValue;
Dans votre exemple, vous pouvez simplement laisser les crochets:
return BaseValue*365/360;
Vous n'avez besoin que de l'un des doubles lancers. Alors
return BaseValue * (decimal)(365/(double)360);
fonctionnera bien.
Une fois que l'on est un double, le compilateur sait le traiter comme une division non entière.
Alternativement
return (BaseValue*365)/360;
marchera.
ou même
return BaseValue*365/360;
puisque la multiplication est de priorité supérieure à la division.
Vous pouvez simplement utiliser littéraux décimaux , en utilisant le suffixem
:
public decimal ConvertedValue
{
get
{
return BaseValue * (365m/360);
}
}
La seconde distribution est redondante, car C # en déduit que le premier nombre (365) de votre expression ((double)365 / (double)360)
est une double
. Donc, afin de calculer la division, il convertira implicitement le deuxième élément en un double
également. Donc, peu importe si vous écrivez (double)
en tant que deuxième élément:
csharp> (double) 365/350
1.04285714285714
csharp> (double) 365/ (double) 350
1.04285714285714
Néanmoins, il est tout à fait inutile de lancer les doublages puis les décimales. En utilisant un littéral décimal dans votre expression, l'autre nombre sera également un nombre décimal. Nous restons donc dans le monde decimal
.
Un double divisé par un double est (bien sûr) un double. Donc, le résultat est redondant.
Il serait plus court si vous spécifiez simplement les nombres en décimales:
return BaseValue * (365m /360);
L'un des (doubles) transts est redondant, mais pas les deux . Si l'un des arguments d'une opération est double, l'autre argument est automatiquement converti en double . Pouvez-vous écrire l'un des arguments sous forme de nombre réel constante, par exemple, 365,0?