如何改进我的代码来计算Swift中两个位置之间的距离?

时间:2017-01-19 22:29:24

标签: swift swift3

在我当前的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。

你能帮帮我吗?

5 个答案:

答案 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)

我想建议两件事:

  1. 不要对双精度进行舍入,但在转换为字符串进行显示时格式化结果
  2. 不要将格式更改为4,这似乎不太直观
  3. 如果您能接受这些建议,可以使用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