在我当前的func calculateDisatnceBetweenTwoLocations(_ destination:CLLocation) -> Double{
let distanceMeters = CLLocation(latitude: latitude, longitude: longitude).distance(from: destination)
let distanceKM = distanceMeters / amount
return distanceKM.roundedTwoDigit()
应用中,我有一个用于计算两个位置之间距离的代码。它的工作原理如下:
Double
,extension Double {
/// Rounds the double to decimal places value
func roundedTwoDigit() -> Double {
let divisor = pow(10.0, Double(2))
return (self * divisor).rounded() / divisor
}
}
的扩展名如下:
function deleteOrg(id) {
const verifyOrg = (orgObject) => {
if (orgObject.verified_at !== null) {
throw new Error(422, 'Unable to delete organization')
}
};
const destroyOrg = () => new Organization().where({
'id': id
}).destroy();
return findById(id)
.then(verifyOrg)
.then(destroyOrg);
}
现在,无论距离多长,它总是四舍五入到两位数。
我想改变它,所以当距离高于4公里时,它应该显示它四舍五入到底座,所以例如5.42公里它会显示5,而6.78它会显示7。 但是,如果距离低于4km,则应将其四舍五入到第一个数字,例如对于3.21,它将显示3.2,对于2.58,它将显示2.6。
你能帮帮我吗?
答案 0 :(得分:4)
与往常一样,您应该使用NumberFormatter
向用户显示数字,不要自己围绕数字。
func formatDistance(_ distance: Double) -> String {
let numDecimalDigits = (distance >= 4) ? 0 : 2
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.minimumFractionDigits = numDecimalDigits
formatter.maximumFractionDigits = numDecimalDigits
let formattedDistance: String = formatter.string(for: distance)!
return "\(formattedDistance) km"
}
print(formatDistance(6.78)) // 7 km
print(formatDistance(2.05)) // 2.05 km
答案 1 :(得分:1)
虽然这绝对是正确的方式,但Sulthan的答案并不完全是:
如果在<的情况下给出2位小数。 4公里,如果它被舍入到x.0,它将打印尾随零。
此外,2.05将轮到2.0,而不是2.1。
func formatDistance(_ distance: Double) -> String {
let numDecimalDigits = (distance >= 4) ? 0 : 1
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.roundingMode = .halfUp
formatter.minimumFractionDigits = 0
formatter.maximumFractionDigits = numDecimalDigits
let formattedDistance: String = formatter.string(for: distance)!
return "\(formattedDistance) km"
}
print(formatDistance(6.78)) // 7 km
print(formatDistance(2.05)) // 2.1 km
print(formatDistance(2.049)) // 2 km
答案 2 :(得分:1)
我想建议两件事:
如果您能接受这些建议,可以使用NumberFormatter
格式化为特定的有效数字:
let nums = [0.12345, 1.56789, 2.49876, 5.99999, 9.49876, 11.55555, 19.54321, 123.6]
let formatter: NumberFormatter = {
let f = NumberFormatter()
f.maximumSignificantDigits = 2
return f
} ()
nums.forEach {
print(formatter.string(from: NSNumber(value: $0)) ?? "n/a")
}
// Prints:
// 0.12
// 1.6
// 2.5
// 6
// 9.5
// 12
// 20
// 120
答案 3 :(得分:0)
由于您提到要在Double
中执行操作。这是另一种变体:
extension Double {
mutating func roundedTwoDigit() -> Double {
let divisor = pow(10.0, Double((self >= 4) ? 0 : 1))
if (self > 4) {
self.round(.toNearestOrAwayFromZero)
}
return (self * divisor).rounded() / divisor
}
}
答案 4 :(得分:0)
我已经尝试了这个并且它似乎有效,它也会将你的答案作为双重回复
extension Double {
func roundedTwoDigit() -> Double {
if self < 4 {
return (self * 10).rounded() / 10
}
else {
return self.rounded()
}
}
}
print(Double(5.42).roundedTwoDigit()) //5.0
print(Double(6.78).roundedTwoDigit()) //7.0
print(Double(3.21).roundedTwoDigit()) //3.2
print(Double(2.58).roundedTwoDigit()) //2.6