我一直在使用测量对象来转换大部分长度。但我有一个奇怪的问题。如果我将英里转换为英尺,我几乎会得到正确的答案。
import Foundation
let heightFeet = Measurement(value: 6, unit: UnitLength.feet) // 6.0ft
let heightInches = heightFeet.converted(to: UnitLength.inches) // 72.0 in
let heightMeters = heightFeet.converted(to: UnitLength.meters) // 1.8288 m
let lengthMiles = Measurement(value: 1, unit: UnitLength.miles) // 1.0 mi
let lengthFeet = lengthMiles.converted(to: UnitLength.feet) // 5279.98687664042 ft
// Should be 5280.0
除了最后一个长度英尺之外,它们都有效。在我的 Playground(Xcode 版本 9.2 (9C40b))中,它返回 5279.98687664042 ft。我还在常规应用程序构建中进行了测试,结果相同。
有什么想法吗?
基金会库中的“英里”单位定义不正确,如以下所示
print(UnitLength.miles.converter.baseUnitValue(fromValue: 1.0))
// 1609.34
其中作为正确值 https://en.wikipedia.org/wiki/Mile#International_mile is 1.609344
。
作为基础库中该缺陷的解决方法,您可以定义
您的“更好”英里单位:
extension UnitLength {
static var preciseMiles: UnitLength {
return UnitLength(symbol: "mile",
converter: UnitConverterLinear(coefficient: 1609.344))
}
}
并使用它给出预期的结果:
let lengthMiles = Measurement(value: 1, unit: UnitLength.preciseMiles)
let lengthFeet = lengthMiles.converted(to: UnitLength.feet)
print(lengthFeet) // 5280.0 ft
当然,作为亚历山大说 https://stackoverflow.com/a/49373502/1187415,
使用单位进行计算时可能会出现舍入误差,因为测量使用
二进制浮点值作为底层存储。
但造成“明显偏离”结果的原因是错误的定义
英里单位。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)