2012-06-20 21 views

Respuesta

21

Cualquiera de estas ayuda?

println(3.0/4.0) 
println(3.toDouble/4.toDouble) 
41

Si está escribiendo el número, sólo tiene que escribir al menos uno de ellos como un flotador (supongo que te refieres Float no Double):

println(3f/4) 

Si ya tiene los números en las variables , convertir al menos uno de ellos con toFloat

val x = 3 
println(x.toFloat/4) 

(en cada caso, si tiene al menos uno, el compilador convertir al otro a Float para que coincida)

+3

Es probable que desee utilizar un doble, en lugar de un flotador. –

6

Para los tipos primitivos (Int, Flotante, Doble, etc.), Scala sigue las reglas en Java.

Si escribe enteros literales 3, 4, y así sucesivamente, sus expresiones permanecerán como enteros. Así

println(3/4) 

tiene una expresión que consta de dos enteros por lo que el resultado es un entero: 0.

Si cualquiera de los valores pasa a ser un flotador en lugar de un Int, toda la expresión se amplía para convertirse en una Flotador. Lo mismo es cierto para un doble. Esta ampliación ocurre de manera casi completamente automática, solo tiene que darle al compilador la pista de lo que quería, p.

println(3f/4) 

amplía a flotar y

println(3.0/4) 

amplía al doble.

Al utilizar estas funciones de idioma en programas reales, siempre piense en la pérdida de precisión que puede ocurrir. Ya has notado la división entera que causa la pérdida de la fracción decimal en ese caso. Pero hay un caso diferente de coma flotante que se ilustra aquí:

println(4f/3) 

El resultado real se mantiene en una representación binaria (utilizando el estándar IEEE754) que tiene fracciones binarias, fracciones no decimales, y así no son capaces de sostener 4f/3 sin un pequeño error.

scala> println(100f/99f * 99) 
99.99999 

Es posible que haya que esperar para imprimir 100. A veces esto no importa ya veces lo hace. Un caso muy común donde importa mucho es cuando se trata de valores monetarios. La regla general es SIEMPRE EVITAR flotar y doblar por dinero: utilice BigDecimal en su lugar, o simplemente mantenga el número de peniques como Long quizás, o recurra a Strings (que funcionan muy bien con BigDecimal siempre que no se analicen como valores Double en el camino).

Cuestiones relacionadas