在Swift中将双精度值舍入到x位小数

545

有人可以告诉我在Swift中如何将double值舍入到x位小数吗?

我有:

var totalWorkTimeInHours = (totalWorkTime/60/60)

使用 totalWorkTime 表示时间长度,数据类型为 NSTimeInterval (double)(以秒为单位)。

totalWorkTimeInHours 给出的是小时数,但它会给出一个非常长的精确数字,例如 1.543240952039......

当我打印 totalWorkTimeInHours 时,如何将其四舍五入到 1.543 这样的值?


2
请查看我的答案,以找到使用Darwin round(_:)Double round()NSString初始化器、String初始化器、NumberFormatter、Double扩展甚至NSDecimalNumberDecimal舍入双精度的多达9种不同的方法。 - Imanou Petit
@Rounded,一个Swift 5.1属性包装器:https://gist.github.com/abhijithpp/1cc41b41a5d1c8f007da90f20bc0c65f - Abhijith
36个回答

1
//find the distance between two points
let coordinateSource = CLLocation(latitude: 30.7717625, longitude:76.5741449 )
let coordinateDestination = CLLocation(latitude: 29.9810859, longitude: 76.5663599)
let distanceInMeters = coordinateSource.distance(from: coordinateDestination)
let valueInKms = distanceInMeters/1000
let preciseValueUptoThreeDigit = Double(round(1000*valueInKms)/1000)
self.lblTotalDistance.text = "Distance is : \(preciseValueUptoThreeDigit) kms"

1
对于许多应用程序,您需要精确的小数位数进行四舍五入。
对于另一些应用程序,您没有这样的限制,并希望“压缩”输出大小,但仍希望避免像导出具有数百万数字的JSON那样将数字转换为字符串(反之亦然)。
在这种情况下,您可以使用“技巧”来舍入有效数字(尾数),而不是整个数字。在这种情况下,您将以最终小数位数结束,并且大多数数字仍将保留至多例如3个小数位(如果需要),而某些数字则会稍微多一些。
这就是您可能会期望的这种方法与十进制数字一起使用的结果:
5.2472 5.2516 5.2556 5.26 5.264
而不是:
5.24731462499949 5.251488374999099 5.25566283399894 5.259839374999501 5.264012208999702
let value = 5.24731462499949

print(value)
// 5.24731462499949

let valueSignificandRounded = round((1000 * 10) * value.significand) / (1000 * 10)

let valueRounded = CGFloat(sign: v.sign, exponent: v.exponent, significand: valueSignificandRounded)

print(valueRounded)
// 5.2472

1
许多例子都使用数学,问题在于浮点数是实数的近似值,没有办法精确地表示0.1(1/10)作为浮点数,就像没有精确的方法使用小数点精确表示1/3一样。因此,您需要确切地了解自己想要实现什么,如果只想显示它们,请将它们保留在代码中不变,试图四舍五入会使您得到不太准确的结果,因为您正在丢弃宝贵的信息。将小数表示的1/3四舍五入到小数点后一位并不会给您一个更接近1/3的数字,使用NumberFormat来进行四舍五入,如果您有像viewModel类这样的东西,则可以用它来返回模型数字的字符串表示形式。NumberFormaters可以让您对数字的格式和所需的小数位数进行很好的控制。

1

Swift 4 最佳方法

这是我用来保留两位小数的方法

let val = round(100 * scale) / 100

1

如果您想在小数点后只保留0位,可以尝试以下方法:

extension Double {
    func isInteger() -> Any {
        let check = floor(self) == self
        if check {
            return Int(self)
        } else {
            return self
        }
    }
}

let toInt: Double = 10.0
let stillDouble: Double = 9.12

print(toInt.isInteger) // 10
print(stillDouble.isInteger) // 9.12

-1
在Swift中将一个双精度值舍入到x位小数的方法
输入 = 2.99999999 输出 = 2.9
输入 = 2.0 输出 = 2 print(2.9999.roundDecimal(places: 1)) // 这将打印出"2.9" print(2.9999.roundDecimal(places: 2)) // 这将打印出"2.99"
extension Double {
    func roundDecimal(places: Int = 2) -> String {
        if self == Double(Int(self)) {
            return "\(Int(self))"
        } else {
            let multiplier = pow(10.0, Double(places))
            let doubleNumber = self
            let integerPart = Int(doubleNumber)
            let decimalPart = Int(doubleNumber * multiplier) % Int(multiplier)
            let combinedString = "\(integerPart).\(decimalPart)"
            return combinedString
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接