2015-03-29 4 views

ответ

3

Я думаю, ваша проблема в том, что вы делите два целых числа, которые обычно возвращают целое число. У меня была аналогичная проблема в java, добавив 0. к одному или другим целым числам или преобразованию либо в double с помощью двойной функции, чтобы исправить это.

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

1

Цифры верны в отношении причины; вместо подхода вы принимаете, попробуйте следующее:

print(2.0/5.0) 
6

Проблема заключается в том, что вы не не преобразовывая в Double только после того как вы сделали целочисленное деление между двумя целыми числами. Давайте посмотрим на порядок операций. Мы начинаем с внутренней стороны и выходим наружу.

  • Выполните целочисленное деление между целым числом и 2 целым числом 5, что приводит к целому числу 0.
  • Создайте двойной из целого числа 0, который создает двойной 0.0.
  • Вызов description на двойной 0.0, который возвращает строку "0.0"
  • вызов println на струне "0.0"

Мы можем исправить это, вызывая Double конструктор на каждой стороне разделения до мы разделим их.

println((Double(2)/Double(5))) 

Теперь порядок операций:

  • Преобразование целого числа 2 к плавающей точкой 2.0
  • Преобразование целого числа 5 к плавающей точкой 5.0
  • Perform с плавающей точкой разделения между ними числа с плавающей запятой, в результате чего 0.4
  • Звоните description с номером с плавающей запятой 0.4, который возвращает строку "0.4".
  • Звонок println на строке "0.4".

Обратите внимание, что это не является строго необходимым, чтобы преобразовать обе стороны разделения на Double.

И до тех пор, пока мы имеем дело с литералами, мы можем просто написать println(2.0/5.0).

Мы также можем уйти от написания println((2 * 1.0)/5), который теперь должен интерпретировать все наши литералы как плавающие точки (поскольку мы умножили его на плавающую точку).

Поскольку любая из сторон математической операции является типом с плавающей точкой, целочисленный литерал будет интерпретироваться как тип с плавающей точкой Swift, но, на мой взгляд, гораздо лучше явно преобразовать наши типы, мучительно ясно, что именно мы хотим. Итак, давайте переведем все наши числа в один и тот же тип и будем явно ясно, что мы действительно хотим.


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

println(2.0/5.0) 

Если мы делаем с переменными, мы можем использовать конструктор:

let myTwoInt: Int = 2 
let myFiveInt: Int = 5 

println((Double(myTwoInt)/Double(myFiveInt))