Swift函数返回错误的计算结果

问题描述 投票:2回答:1

我是编程新手,这是我的第一个程序和问题。我正在尝试编写一个将十进制时间简单地转换为小时和分钟的函数。我要删除小时,然后将小数分钟乘以60,然后将两者加在一起作为一个字符串。我需要在程序中多次使用此功能,因此需要使用该功能。使用此函数的计算很简单,但结果却很奇怪。如果我将“ plannedStartFuel”保持为450并调整“ minLandAllowance”,则会得到以下结果,

185 returns 1:28
182 returns 1:29
181 returns 1:30
180 returns 2:30
179 returns 2:30
175 returns 2:32

正确答案是1:00数字。我不明白为什么该程序似乎在180点时将结果增加了一个小时。我敢肯定,有比我用过的更好的方法来完成此计算,但是如果您能提供帮助,我将不胜感激,以了解引起错误的原因以及原因。我尝试了什么?...一切!如果您的答案是在7岁的时候提出的,我可能会有理解的机会。谢谢。

import UIKit
import Foundation

func decimalHoursConv (hours : Double) -> (_hrs:String, mins:String) {

    let remainder = hours.truncatingRemainder(dividingBy: 1) * 60
    let mins = (String(format: "%.0f", remainder))

    let hrs = (String(format: "%.0f", hours))

    return (hrs, mins)
}
var plannedStartFuel = Double (0)
var minLandAllowance = Double (0)
var flyingTimeToMLA = Double(0)

plannedStartFuel = 450
minLandAllowance = 180

flyingTimeToMLA = ((plannedStartFuel - minLandAllowance) / 3)/60

let MLAtime = (decimalHoursConv(hours: flyingTimeToMLA))

print ("Flight Time To MLA =", MLAtime.0,"hrs",MLAtime.1,"mins")
swift function calculation
1个回答
0
投票

[如果您使用的是Swift,则可以使用Measurement

func convertToHoursAndMinutes(_ value: Double) -> DateComponents {
    let unitMeasurement = Measurement(value: value, unit: UnitDuration.minutes)
    let hours = unitMeasurement.converted(to: .hours).value
    let decimalPart = hours.truncatingRemainder(dividingBy: 1)
    let decimalPartMeasurement = Measurement(value: decimalPart, unit: UnitDuration.hours)
    let decimalPartMeasurementInMinutes = decimalPartMeasurement.converted(to: .minutes)
    let minutes = decimalPartMeasurementInMinutes.value.rounded(.toNearestOrEven)
    return DateComponents(hour: Int(hours), minute: Int(minutes))
}

用法:

var value = (450.0-185.0)/3 // 88.33333333333333
convertToHoursAndMinutes(value) // hour: 1 minute: 28 isLeapMonth: false 
value = (450.0-182.0)/3 // 89.33333333333333
convertToHoursAndMinutes(value) // hour: 1 minute: 29 isLeapMonth: false 
value = (450.0-181.0)/3 // 89.66666666666667
convertToHoursAndMinutes(value) // hour: 1 minute: 30 isLeapMonth: false 
value = (450.0-180.0)/3 // 90
convertToHoursAndMinutes(value) // hour: 1 minute: 30 isLeapMonth: false 
value = (450.0-179.0)/3 // 90.33333333333333
convertToHoursAndMinutes(value) // hour: 1 minute: 30 isLeapMonth: false 
value = (450.0-175.0)/3 // 91.66666666666667
convertToHoursAndMinutes(value) // hour: 1 minute: 32 isLeapMonth: false

请注意,如果愿意,可以始终使用元组而不是DateComponents

© www.soinside.com 2019 - 2024. All rights reserved.