Подтвердить что ты не робот

Scala Разделите два целых числа и получите результат поплавка

Если я сделаю следующее

 println(3/4)
 >0

Я хочу получить десятичный ответ вместо целого числа. Из-за того, как я печатаю в своем фактическом коде, я бы предпочел включить в println, если это возможно.

4b9b3361

Ответ 1

Если вы вводите номер, просто введите хотя бы один из них как float (я предполагаю, что вы имеете в виду Float not Double):

println(3f/4)

Если у вас уже есть числа в переменных, конвертируйте хотя бы один из них с помощью toFloat

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

(В каждом случае, если у вас есть хотя бы один, компилятор преобразует другой в Float для соответствия.)

Ответ 2

Любые из них помогут?

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

Ответ 3

Для примитивных типов (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 при условии, что они не обрабатываются как двойные значения на путь).