Проблема с быстрым плаванием внутри структур - PullRequest
0 голосов
/ 24 августа 2018

У меня возникла проблема, когда swift изменяет мое значение с плавающей точкой, когда оно находится внутри структуры. Я не думаю, что это произошло в более старых версиях swift, но сейчас это происходит в 4.1. Пример кода ниже ... мысли?

var f = Float(4.111)

print(f) // prints 4.111

struct FloatContainer {
    var f: Float
}

let container = FloatContainer(f: f)

print(container) // prints FloatContainer(f: 4.11100006)

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

Вы должны попробовать напечатать значение внутри

print(container.f) // prints 4.111

Это возвращает то, что вы храните.

0 голосов
/ 01 сентября 2018

Swift предоставляет представление отладки по умолчанию для любого типа, и это является причиной документации Apple

 var f = Float(4.111)

    print(f) // prints 4.111

    print(f.debugDescription) // prints 4.11100006
    print(String(reflecting: f)) // default presentation according to documentation: prints 4.11100006

    struct FloatContainer: CustomStringConvertible {
        var f: Float

        // You can achieve similar output to `print(f)` with conforming
        // to `CustomStringConvertible` and implementing custom 
        // `description` implementation
        var description: String {
            return f.description
        }
    }

    let container = FloatContainer(f: f)
    // After our custom implementation the result of `print` 
    // method is the same to print(f)
    print(container) // prints FloatContainer(f: 4.111)
0 голосов
/ 24 августа 2018

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

Здесь - это онлайн-конвертер из десятичного представления в представление с плавающей запятой. Как вы можете видеть, есть ошибка (6.103515625E-8) из-за преобразования:

Floating Point Converter

Что касается разницы между тем, когда вы печатаете непосредственно с плавающей точкой, или когда вы печатаете объект, у которого есть свойство с плавающей точкой, то это сводится к свойству description объектов, которые реализуют протокол CustomStringConvertible. Когда функция print хочет выполнить печать на консоль, она вызывает _print_unlocked , которая является внутренней функцией с этим блоком:

if case let printableObject as CustomStringConvertible = value {
    printableObject.description.write(to: &target)
    return
}

Таким образом, вы можете изменить свой код на это, чтобы получить ожидаемый результат:

struct FloatContainer : CustomStringConvertible {
    var description: String {
        get {
            return f.description
        }
    }
    var f: Float
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...