我正在尝试制作一个增长率(Double)的计算器,它将结果四舍五入到最接近的整数并从那里重新计算,如下:
let firstUsers = 10.0
let growth = 0.1
var users = firstUsers
var week = 0
while users < 14 {
println("week \(week) has \(users) users")
users += users * growth
week += 1
}
Run Code Online (Sandbox Code Playgroud)
但到目前为止我一直无法做到.
编辑 我有点喜欢这样:
var firstUsers = 10.0
let growth = 0.1
var users:Int = Int(firstUsers)
var week = 0
while users <= 14 {
println("week \(week) has \(users) users")
firstUsers += firstUsers * growth
users = Int(firstUsers)
week += 1
}
Run Code Online (Sandbox Code Playgroud)
虽然我不介意它总是四舍五入,但我不喜欢它,因为 …
我怎样才能在Swift中收集CGFloat?我试过ceil(CDouble(myCGFloat))但只适用于iPad Air和iPhone 5S.
当在另一个模拟设备上运行时,我收到错误消息 'NSNumber' is not a subtype of 'CGFloat'
在玩游戏时,我在swift中找到了round()函数.它可以用如下:
round(0.8)
Run Code Online (Sandbox Code Playgroud)
哪个将按预期返回1.这是我的问题:
我怎么快速地绕千分之一?
我希望能够插入一个数字,比如0.6849,然后回到0.685.round()如何做到这一点?或者,它不是,在这种情况下,什么功能呢?
在OS X和iOS中,Apple使用CGFloat typedef自动获取float32位系统和double64位系统.但是当使用普通的Unix数学函数时,您需要根据具体情况做出决定.
例如,该floor()函数定义为:
double floor(double x);
并且该floorf()函数定义为:
float floorf(float x);
我知道今天所有的iOS设备都是32位,但是使用CGFloat的原因是在引入第一个64位iOS设备(iPad 5?)时自动提高精度,而不必更改任何代码.但为了实现这一点,我们需要基于CGFloat的数学函数:
CGFloat Floor(CGFloat x);
在iOS或任何第三方库中是否有类似的功能?或者其他开发者如何处理这个?我怀疑大多数要么CGFloat与floatiOS 上的-versions 一起使用,但是如果编译64位iOS设备(并处理代码库的两个不同版本),你将"需要"用数学函数更改每一行.
或者您可以使用float而不是在CGFloat任何地方,而不是担心64位iOS.但是,你会发现与Apple的库和恕我直言的丑陋代码不一致.
或者你可以CGFloat和double-versions 一起使用,只需要让编译器一直在double和float之间进行转换.而不是关心可能的"隐式转换为32位类型"警告.
或者也许是最好的策略,没有任何64位版本的iOS的赌注将会到来(或者至少在未来足够的时候),CGFloat并与floatUnix数学函数的转换一起使用,而不用担心未来.
你用什么策略?
我经常需要地板或CEIL一CGFloat到int,对于数组索引的计算.
我看到永久的问题floorf(theCGFloat)或者ceilf(theCGFloat)是有可与浮点不准确的麻烦.
那么,如果我CGFloat的2.0f内部被表示为1.999999999999f或类似的东西,那该怎么办呢?我floorf并获得1.0f,这是再次浮动.然而,我必须把这个野兽施放到int,这可能会引入另一个问题.
是否有一个最佳实践如何楼或小区一float到int这样的东西像2.0永远不会意外遭到地板到1让人觉得2.0永远不会意外遭到ceiled来2?
math floating-point floating-accuracy ios floating-point-precision
TLDR:如何在没有警告的情况下编译32位和64位CGFloats的方式调用标准浮点代码?
CGFloat定义为double或float,具体取决于编译器设置和平台.我正在尝试编写在两种情况下都能正常工作的代码,而不会产生很多警告.
当我使用floor,abs,ceil和其他简单浮点运算之类的函数时,我会收到关于值被截断的警告.例如:
警告:隐式转换将64位值缩短为32位值
我不关心计算的正确性或精度损失,因为我意识到我可以一直使用所有函数的双精度版本(floor而不是floorf等); 但是,我必须容忍这些错误.
有没有办法干净地编写支持32位和64位浮点数的代码,而不必使用大量的#ifdef __ LP64 __,或者为所有标准浮点函数编写包装函数?
我试图做这样的事情
var myCGFloat: CGFloat = 3.001
ceilf(myCGFloat)
Run Code Online (Sandbox Code Playgroud)
但ceilf只Float取值.在搜索时,有很多关于进行此转换的不同答案,或者取决于它是32位还是64位架构.
事实证明解决方案相当容易,但我花了太长时间才找到它.所以我写这个Q&A对作为其他人的捷径.