web-dev-qa-db-fra.com

Scala Divisez deux entiers et obtenez un résultat flottant

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.

39
richsoni

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.)

54
Rex Kerr

Une de ces aides?

println(3.0/4.0)
println(3.toDouble/4.toDouble)
24
Alex Wilson

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).

7
Rick-777