Вот мой код:Отдел не работает должным образом в Swift
println(Double(2/5))
Когда я запускаю это, он печатает
0.0
Как я могу это исправить? Я хочу, чтобы он вышел на 0.4
. Это какая-то проблема с округлением?
Вот мой код:Отдел не работает должным образом в Swift
println(Double(2/5))
Когда я запускаю это, он печатает
0.0
Как я могу это исправить? Я хочу, чтобы он вышел на 0.4
. Это какая-то проблема с округлением?
Я думаю, ваша проблема в том, что вы делите два целых числа, которые обычно возвращают целое число. У меня была аналогичная проблема в java, добавив 0. к одному или другим целым числам или преобразованию либо в double с помощью двойной функции, чтобы исправить это.
Это особенность типизированных языков, которая создает результат того же типа, что и разделяемые значения.
Цифры верны в отношении причины; вместо подхода вы принимаете, попробуйте следующее:
print(2.0/5.0)
Проблема заключается в том, что вы не не преобразовывая в 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
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))