Оператор "Swift" / "не работает или я что-то пропустил? - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь инициализировать следующий массив дробей на игровой площадке Swift

var probabilitiesX = Array(repeating: Double(1/36), count: 36)

, но мой выходной массив:

[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

в основном все нули.Если я введу дробь в виде десятичной дроби "0.02777777", то получу правильный вывод, однако я использую различные дроби и в идеале не хочу выводить их все.Есть идеи?

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

Похоже, вы знаете, что 1/36 производит 0 из-за целочисленного деления.Вероятно, поэтому вы написали Double(1/36), чтобы Swift рассматривал 1/36 как двойное.

Однако Swift оценивает выражение в другом порядке, чем вы думаете.Swift сначала оценит 1/36, затем оценит Double(0).

Если вы хотите использовать Double.init в своем коде, вы можете сделать это следующим образом:

Double(1)/Double(36)

Теперь,и 1, и 36 преобразуются в двойное до деления.Следовательно, целочисленное деление не происходит.

На самом деле, вам вообще не нужно Double, просто сделайте:

1.0 / 36.0

И 1.0, и 36.0 Double литералы.

0 голосов
/ 07 июня 2018

Как отмечают другие ответы, проблема в том, что 1 и 36 имеют тип Int, поэтому 1/36 выполняется с использованием целочисленного деления с результатом 0.Затем он передается в Double(), который создает Double из 0.

Существует несколько способов исправить это:

  1. Используйте литералы с плавающей запятой, которые будут выводиться как Double s:

    var probabilitiesX = Array(repeating: 1.0/36.0, count: 36)
    

    Вы можете обойтись, используя только литерал с плавающей запятой для одного из них, потому что Swift выведет, чтодругое должно быть Double для разделения на работу:

    var probabilitiesX = Array(repeating: 1/36.0, count: 36)
    

    или

    var probabilitiesX = Array(repeating: 1.0/36, count: 36)
    
  2. Преобразование одного или обоих из 1 и36 до Double:

    var probabilitiesX = Array(repeating: Double(1)/36, count: 36)
    

    или

    var probabilitiesX = Array(repeating: 1/Double(36), count: 36)
    

    или

    var probabilitiesX = Array(repeating: Double(1)/Double(36), count: 36)
    
  3. В ролях1/36 с as Double:

    var probabilitiesX = Array(repeating: 1/36 as Double, count: 36)
    

    В этом случае, поскольку Swift знает, что результатом деления является Double, он может вывести, что 1 и 36 равны Double с, потому что единственная версия деления, которая приводит к Double, это та, которая принимает два Double с в качестве ввода.

  4. Скажите Swift вамсоздаем [Double]:

    var probabilitiesX = [Double](repeating: 1/36, count: 36)
    

    или

    var probabilitiesX: [Double] = Array(repeating: 1/36, count: 36)
    

    В этом случае, поскольку Swift знает, что массив содержит Double, он может сделать вывод, что 1/36 является Double, и, подобно # 3, он выводит, что 1 и 36 равны Doubles, потому что единственная версия деления, которая приводит к Double, это та, которая принимает два Double s в качестве ввода.

0 голосов
/ 07 июня 2018

Ваша проблема здесь: 1/361 , и 36 являются Int с.Попробуйте это:

var probabilitiesX = Array(repeating: 1.0 / 36.0, count: 36)
...