ios - Swift 中 Double 的拆分和组合

标签 ios swift math time

我想将持续时间存储在 Double 中,并且需要提取 Double 的高值和低值(小时和分钟)以访问它们。我还需要能够使用两个 Ints(hourminute)设置 Double
我现在在这里得到了一些东西:

extension Double {
    func hour() -> Int {
        return NSNumber(double: floor(self)).integerValue
    }

    func minute() -> Int {
        return NSNumber(float: Float(Double((self - floor(self)) * 100))).integerValue
    }

    init(hour: Int, minute: Int) {
        self = Double(hour) + ( Double(minute) / 100 )
    }
}

然后我在我的 appDelegate 的 didFinishLaunchingWithOptions 中对此进行了一些测试:

var time: Double = 18.30

NSLog("Time is \"%f\" - so hours is \"%d\" and minutes is \"%d\".", time, time.hour(), time.minute())

time = Double(hour: 10, minute: 1)
NSLog("Time is \"%f\" - so hours is \"%d\" and minutes is \"%d\".", time, time.hour(), time.minute())

time = Double(hour: 15, minute: 45)
NSLog("Time is \"%f\" - so hours is \"%d\" and minutes is \"%d\".", time, time.hour(), time.minute())

现在,这段代码可以工作了。有人可能想知道为什么我在 minute() 函数中将 Double 转换为 Float。这是因为在将这些 Float 转换为 之前,我在使用 Double 而未将它们转换为 Float 时遇到了一个未知问题整数。如果分钟未以 0 结尾,则由于未知原因减去一分钟。
例如,10:42 返回 10 小时41 分钟
但是 10:30 仍然是 10 小时 30 分钟。< br/>另外 10:0010 小时0 分钟

我在这里发布的这个例程似乎有效,但我只是想知道,如果我尽可能高效......这里的转换比需要的多。
那么,有什么改进吗?

有人知道我提到的分钟减少的未知问题的原因吗?

最佳答案

二进制 float ,例如 DoubleFloat 不能准确表示数字 10.42,因此 将小数部分乘以 100 并截断结果可能会得到 41。 通过转换为 Float,您只是在“隐藏”问题。

这是一个舍入而不是截断的版本,总体上更简单一些。我从你的代码中采用了“分钟”的符号, 即使它代表一小时的 1/100 而不是 1/60。

extension Double {

    func hour() -> Int {
        return Int(self)
    }

    func minute() -> Int {
        return Int(round(self * 100.0)) % 100
    }

    init(hour: Int, minute: Int) {
        self = Double(hour) + ( Double(minute) / 100 )
    }
}

解决您问题的其他可能方法:

  • 将持续时间存储为代表总计的整数 分钟数。例如。 “10:42”将存储为 10*60 + 42。 那么你就完全没有舍入问题。

  • 使用基金会 输入 NSDecimalNumber 而不是 Double,它可以表示 最多 38 位的十进制整数。

关于ios - Swift 中 Double 的拆分和组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28254510/

相关文章:

ios - 根据键的值对来自 Web 服务的数据进行排序

swift - 如何清除两个 pickerView 中的一个?

ios - 在调整角度的同时根据图片计算梯形的面积

ios - RestKit 与 NSDateFormatter

JavaScriptCore 不会将字符串作为 NSObject *

android ios 任何 BLE 的任何唯一 key (我们正在使用所有 BLE - 无制造商依赖性)来识别它

ios - Swift iOS - 参数标签 '(float3:)' 与任何可用的重载不匹配

ios - FirebaseAuthUI 不添加新的 Facebook 用户

Java:使用 `Math.sin()` 时可能会丢失精度

Java代码从四元数获取绕轴的旋转角度