Если я сделаю следующее
println(3/4)
>0
Я хочу получить десятичный ответ вместо целого числа. Из-за того, как я печатаю в своем фактическом коде, я бы предпочел включить в println, если это возможно.
Если я сделаю следующее
println(3/4)
>0
Я хочу получить десятичный ответ вместо целого числа. Из-за того, как я печатаю в своем фактическом коде, я бы предпочел включить в println, если это возможно.
Если вы вводите номер, просто введите хотя бы один из них как float (я предполагаю, что вы имеете в виду Float
not Double
):
println(3f/4)
Если у вас уже есть числа в переменных, конвертируйте хотя бы один из них с помощью toFloat
val x = 3
println(x.toFloat/4)
(В каждом случае, если у вас есть хотя бы один, компилятор преобразует другой в Float
для соответствия.)
Любые из них помогут?
println(3.0/4.0)
println(3.toDouble/4.toDouble)
Для примитивных типов (Int, Float, Double и т.д.) Scala следует правилам на Java.
Если вы пишете литералы целых чисел 3, 4 и т.д., их выражения останутся целыми. Так
println(3/4)
имеет выражение, состоящее из двух целых чисел, поэтому результат представляет собой целое число: 0.
Если какое-либо из значений является Float вместо Int, все выражение расширяется, чтобы стать Float. То же самое верно для Double. Это расширение происходит почти полностью автоматически - вам просто нужно дать компилятору намек на то, что вы хотели, например.
println(3f/4)
расширяется до Float и
println(3.0/4)
расширяется до Double.
При использовании этих языковых функций в реальных программах всегда думайте о потере точности, которая может произойти. Вы уже заметили целочисленное деление, вызывающее потерю десятичной дроби в этом случае. Но здесь есть другой пример для плавающей запятой:
println(4f/3)
Фактический результат сохраняется в двоичном представлении (с использованием стандарта IEEE754), который имеет двоичные дроби, а не десятичные дроби, и поэтому не может удерживать 4f/3 без небольшой ошибки.
scala> println(100f/99f * 99)
99.99999
Возможно, вы ожидали, что он будет печатать 100. Иногда это не имеет значения, и иногда это происходит. Один очень распространенный случай, когда это имеет значение, - это иметь дело с денежными ценностями. Эмпирическое правило ВСЕГДА ИЗБЕГАЙТЕ плавать и удваивать за деньги: вместо этого используйте BigDecimal или просто удерживайте число пенсов как длинное, возможно, или иногда прибегайте к строкам (которые хорошо играют с BigDecimal при условии, что они не обрабатываются как двойные значения на путь).