Si je fais ce qui suit
println(3/4)
>0
Je voudrais obtenir une réponse décimale au lieu d'un entier. En raison de la façon dont j'imprime dans mon code actuel, je préférerais faire un cast dans println si cela est possible.
Si vous saisissez le nombre, tapez simplement au moins l'un d'entre eux comme un flottant (je suppose que vous voulez dire Float
pas Double
):
println(3f/4)
Si vous avez déjà les nombres dans des variables, convertissez au moins l'un d'entre eux avec toFloat
val x = 3
println(x.toFloat/4)
(Dans chaque cas, si vous en avez au moins un, le compilateur convertira l'autre en Float
pour qu'il corresponde.)
Une de ces aides?
println(3.0/4.0)
println(3.toDouble/4.toDouble)
Pour les types primitifs (Int, Float, Double etc), Scala suit les règles en Java.
Si vous écrivez des entiers littéraux 3, 4, etc., leurs expressions resteront sous forme d'entiers. Donc
println(3/4)
a une expression composée de deux entiers donc le résultat est un entier: 0.
Si l'une des valeurs se trouve être un flottant au lieu d'un int, l'expression entière s'élargit pour devenir un flottant. Il en va de même pour un Double. Cet élargissement se produit presque complètement automatiquement - il vous suffit de donner au compilateur l'indice de ce que vous vouliez, par exemple.
println(3f/4)
s'élargit à Float et
println(3.0/4)
s'élargit à Double.
Lorsque vous utilisez ces fonctionnalités de langage dans de vrais programmes, pensez toujours à la perte de précision qui peut se produire. Vous avez déjà remarqué la division entière entraînant la perte de la fraction décimale dans ce cas. Mais il existe un cas différent pour la virgule flottante qui est illustré ici:
println(4f/3)
Le résultat réel est conservé dans une représentation binaire (en utilisant la norme IEEE754) qui a des fractions binaires, pas des fractions décimales, et donc incapable de contenir 4f/3 sans une petite erreur.
scala> println(100f/99f * 99)
99.99999
Vous pourriez vous attendre à ce qu'il imprime 100. Parfois, cela n'a pas d'importance et parfois c'est le cas. Un cas très courant où cela compte beaucoup est lorsqu'il s'agit de valeurs monétaires. La règle de base est TOUJOURS ÉVITER de flotter et de doubler pour de l'argent: utilisez plutôt BigDecimal, ou maintenez simplement le nombre de pence comme Long peut-être, ou parfois recourez à des chaînes (qui jouent bien avec BigDecimal à condition qu'elles ne soient pas analysées en tant que valeurs Double sur le façon).