Rounding a double value to x number of decimal places in swift

前端 未结 28 2582
日久生厌
日久生厌 2020-11-22 06:11

Can anyone tell me how to round a double value to x number of decimal places in Swift?

I have:

var totalWorkTimeInHours = (totalWorkTime/60/60)


        
相关标签:
28条回答
  • 2020-11-22 06:39

    This is more flexible algorithm of rounding to N significant digits

    Swift 3 solution

    extension Double {
    // Rounds the double to 'places' significant digits
      func roundTo(places:Int) -> Double {
        guard self != 0.0 else {
            return 0
        }
        let divisor = pow(10.0, Double(places) - ceil(log10(fabs(self))))
        return (self * divisor).rounded() / divisor
      }
    }
    
    
    // Double(0.123456789).roundTo(places: 2) = 0.12
    // Double(1.23456789).roundTo(places: 2) = 1.2
    // Double(1234.56789).roundTo(places: 2) = 1200
    
    0 讨论(0)
  • 2020-11-22 06:39
    var n = 123.111222333
    n = Double(Int(n * 10.0)) / 10.0
    

    Result: n = 123.1

    Change 10.0 (1 decimal place) to any of 100.0 (2 decimal place), 1000.0 (3 decimal place) and so on, for the number of digits you want after decimal..

    0 讨论(0)
  • 2020-11-22 06:40

    You can use Swift's round function to accomplish this.

    To round a Double with 3 digits precision, first multiply it by 1000, round it and divide the rounded result by 1000:

    let x = 1.23556789
    let y = Double(round(1000*x)/1000)
    print(y)  // 1.236
    

    Other than any kind of printf(...) or String(format: ...) solutions, the result of this operation is still of type Double.

    EDIT:
    Regarding the comments that it sometimes does not work, please read this:

    What Every Programmer Should Know About Floating-Point Arithmetic

    0 讨论(0)
  • 2020-11-22 06:40

    How do I round this down to, say, 1.543 when I print totalWorkTimeInHours?

    To round totalWorkTimeInHours to 3 digits for printing, use the String constructor which takes a format string:

    print(String(format: "%.3f", totalWorkTimeInHours))
    
    0 讨论(0)
  • 2020-11-22 06:42

    This is a sort of a long workaround, which may come in handy if your needs are a little more complex. You can use a number formatter in Swift.

    let numberFormatter: NSNumberFormatter = {
        let nf = NSNumberFormatter()
        nf.numberStyle = .DecimalStyle
        nf.minimumFractionDigits = 0
        nf.maximumFractionDigits = 1
        return nf
    }()
    

    Suppose your variable you want to print is

    var printVar = 3.567
    

    This will make sure it is returned in the desired format:

    numberFormatter.StringFromNumber(printVar)
    

    The result here will thus be "3.6" (rounded). While this is not the most economic solution, I give it because the OP mentioned printing (in which case a String is not undesirable), and because this class allows for multiple parameters to be set.

    0 讨论(0)
  • 2020-11-22 06:43

    A handy way can be the use of extension of type Double

    extension Double {
        var roundTo2f: Double {return Double(round(100 *self)/100)  }
        var roundTo3f: Double {return Double(round(1000*self)/1000) }
    }
    

    Usage:

    let regularPie:  Double = 3.14159
    var smallerPie:  Double = regularPie.roundTo3f  // results 3.142
    var smallestPie: Double = regularPie.roundTo2f  // results 3.14
    
    0 讨论(0)
提交回复
热议问题