2014-09-19 5 views
1

Я пытаюсь познакомиться с Swift и проверить несколько вещей.Печать CGFloat в Swift

Вот странная вещь, которую я не могу понять.

var count : NSInteger = 19 
var percent : CGFloat = 22.01 
var random : NSInteger = NSInteger(percent) 

NSLog("%d, %f, %d", count, percent, random); 
println("\(count), \(percent), \(random)") 

Он должен печатать 19, 22,01, 22, но бревно ...

19, 0.000000, 33875549 
19, 22.0100002288818, 22 

Что здесь не так? После того, как я удалил спецификатор типа, он отлично работает с println не с NSLog.

Вопросы и ответы: Что нового?


ДОБАВЛЕНО

Что о Println? Использование \() не имеет возможности распечатать 22.01?

ответ

2

Я предполагаю, что вы компилируете для 32-разрядной iOS, где CGFloat - это 32-разрядный float.

Ближайший float до 22.01 - это точно 22.0100002288818359375.

Ближайший 64-разрядный double до 22.01 - это точно 22.010000000000001563194018672220408916473388671875.

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

Самая короткая строка, которая преобразуется в Double(22.010000000000001563194018672220408916473388671875), равна 22.01. Но самая короткая строка, которая преобразуется обратно в Double(22.0100002288818359375), равна 22.0100002288818.

2

CGFloats являются странными, поскольку они могут быть 32 или 64 бит в зависимости от системы. Кажется, что NSLog имеет с ними проблему. Если вы набираете процент явно как Float или Double, он будет работать правильно. Вы также можете получить собственный тип cgfloat.native.

NSLog("%d, %f, %d", count, percent.native, random); 
2

Использование %@ для CGFloat и она отлично работает:

NSLog("%d, %@, %d", count, percent, random); 

Это работает, потому что вы можете назвать .description на CGFloat.

Смежные вопросы