ปัดเศษขึ้นสองเท่าเป็นทศนิยม 2 ตำแหน่ง


88

ฉันจะปัดเศษcurrentRatioทศนิยมสองตำแหน่งได้อย่างไร

let currentRatio = Double (rxCurrentTextField.text!)! / Double (txCurrentTextField.text!)!
railRatioLabelField.text! = "\(currentRatio)"

คุณต้องการปัดเศษcurrentRatioเป็นทศนิยมสองตำแหน่งหรือปัดเศษขึ้นเสมอ? เช่นคุณต้องการ 3.141 -> 3.14 หรือ 3.141 -> 3.14?
JAL

สวัสดี JAL ฉันต้องการให้ 3.149 แสดงเป็น 3.15 อย่างไรก็ตาม 3.141 ควรแสดง 3.14 ขอบคุณ
Del Hinds

ดูส่วนแรกของคำตอบของฉันสำหรับการปัดเศษที่ถูกต้อง
JAL

คำตอบ:


174

ใช้สตริงรูปแบบเพื่อปัดเศษทศนิยมสองตำแหน่งและแปลงdoubleเป็นString:

let currentRatio = Double (rxCurrentTextField.text!)! / Double (txCurrentTextField.text!)!
railRatioLabelField.text! = String(format: "%.2f", currentRatio)

ตัวอย่าง:

let myDouble = 3.141
let doubleStr = String(format: "%.2f", myDouble) // "3.14"

หากคุณต้องการปัดเศษทศนิยมสุดท้ายของคุณคุณสามารถทำสิ่งนี้ได้ (ขอบคุณ Phoen1xUK):

let myDouble = 3.141
let doubleStr = String(format: "%.2f", ceil(myDouble*100)/100) // "3.15"

ต้องเป็น 3.15 หากปัดเศษทศนิยมไม่เกินสองตำแหน่ง
Matt Le Fleur

ฉันคิดว่า OP แค่ต้องการปัดเศษเป็นทศนิยมสองตำแหน่งโดยปัดขึ้นหรือลงตามความจำเป็น เพิ่งเพิ่มความคิดเห็นเพื่อขอคำชี้แจง
JAL

สวัสดี Jal ขอบคุณฉันใช้คำตอบของคุณซึ่งได้ผลโดยมีการปรับเปลี่ยนเล็กน้อยดังนี้ - _ = Double (rxCurrentTextField.text!)! / สองเท่า (txCurrentTextField.text!)! railRatioLabelField.text! = สตริง (รูปแบบ: "% .2f", currentRatio)
Del Hinds

2
คำตอบนี้คือคำถาม: "วิธีแสดง Double ด้วยตัวเลขสองหลักในป้ายข้อความ" หรือ "... เป็นสตริง" คำตอบนี้ไม่ได้ตอบคำถาม "ปัดเศษขึ้นเป็นทศนิยม 2 ตำแหน่ง"
mnl

@JAL ฉันต้องการ olny .5 หรือ 0 หลังจากจุดสำหรับอดีต ถ้าเรามี 23.4 มันควรจะให้ 23.5 และถ้า 23.8 มันควรจะเป็น 24.0
กูรู

33

(Swift 4.2 Xcode 11) ส่วนขยายที่ใช้งานง่าย: -

extension Double {
    func round(to places: Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return (self * divisor).rounded() / divisor
    }
}

ใช้:-

if let distanceDb = Double(strDistance) {
   cell.lblDistance.text = "\(distanceDb.round(to:2)) km"
}

ยอดเยี่ยม. ที่จริงฉันต้องการแปลงเป็นคุณสมบัติเดียวกัน (สองเท่า) ส่วนขยายของคุณช่วยแก้ปัญหาของฉันได้ ขอขอบคุณ!
Marcelo dos Santos

:-) Happy coding
Mehul

ฉันคิดว่าคุณเป็นคำตอบที่ถูกต้อง ฉันแค่ต้องการเพิ่มการปรับเปลี่ยนไวยากรณ์ใน func func round(to places: Int) -> Double {
23inhouse

1
@ 23inhouse ฉันได้อัปเดตคำตอบตามคำแนะนำของคุณ ขอบคุณ
Mehul

29

อัปเดตเป็น SWIFT 4 และคำตอบที่เหมาะสมสำหรับคำถาม

หากคุณต้องการปัดเศษทศนิยม 2 ตำแหน่งให้คูณด้วย 100 จากนั้นปัดเศษแล้วหารด้วย 100

var x = 1.5657676754 
var y = (x*100).rounded()/100
print(y)  // 1.57 

1
สวัสดี - ฉันไม่เข้าใจว่าคุณคำนวณอย่างไรในแง่ของการคืนค่าทศนิยมจำนวนหนึ่ง จะทำอย่างไรถ้าฉันต้องการคืนทศนิยม 3 ตำแหน่ง?
Sipho Koza

@SiphoKoza แค่คูณด้วย 1000 แล้วหารด้วย 1000
Chetan Rajagiri

นี่ไม่ใช่คำตอบที่ "ถูกต้อง" จริง ๆ เพราะภายในจำนวนนั้นจะถูกบันทึกไว้ในจุดลอยตัวโดยมีฐาน 2 และคุณกำลังพยายามแทนจำนวนฐาน 10 สำหรับตัวเลขบางตัวไม่มีการแทนค่าที่แน่นอนและคุณจะมีตัวเลขมากเกินไปเมื่อคุณพิมพ์ค่า คำตอบที่ถูกต้องควรส่งคืนสตริงไม่ใช่ Double หรือ Float
Victor Engel

@levan มันใช้งานได้กับศูนย์เช่นกันตรวจสอบให้แน่ใจว่ามันเป็นสองเท่า
Chetan Rajagiri

1
คำตอบที่ดีฉันคิดว่านี่ควรเป็นคำตอบที่ได้รับการยอมรับ
אורי orihpt

15

พิจารณาใช้ NumberFormatter เพื่อจุดประสงค์นี้จะให้ความยืดหยุ่นมากขึ้นหากคุณต้องการพิมพ์เครื่องหมายเปอร์เซ็นต์ของอัตราส่วนหรือหากคุณมีสิ่งต่างๆเช่นสกุลเงินและตัวเลขจำนวนมาก

let amount = 10.000001
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.maximumFractionDigits = 2
let formattedAmount = formatter.string(from: amount as NSNumber)! 
print(formattedAmount) // 10

ฉันได้ผ่านหลาย ๆ ครั้งนี่คือทางไกลทางออกที่ดีที่สุด! ขอบคุณมาก!
kalafun

13

การเพิ่มคำตอบด้านบนหากเราต้องการจัดรูปแบบ Double หลาย ๆ ครั้งเราสามารถใช้ protocol extension ของ Double ได้ดังนี้:

extension Double {
    var dollarString:String {
        return String(format: "$%.2f", self)
    }
}

let a = 45.666

print(a.dollarString) //will print "$45.67"

1
ไม่ควรพิมพ์ (a.dollarString)?
glm4

4

รหัสสำหรับตัวเลขเฉพาะหลังทศนิยมคือ:

var roundedString = String(format: "%.2f", currentRatio)

ที่นี่% .2f จะบอกการหมุนเร็วเพื่อให้ตัวเลขนี้ถูกปัดเศษเป็นทศนิยม 2 ตำแหน่ง


4

@Rounded , a swift 5.1 property wrapper ตัวอย่าง:

struct GameResult {
    @Rounded(rule: NSDecimalNumber.RoundingMode.up,scale: 4)
    var score: Decimal
}

var result = GameResult()
result.score = 3.14159265358979
print(result.score) // 3.1416


2

เพียงคำตอบสั้น ๆ สำหรับ noobs เช่นฉัน:

คุณสามารถทำให้คำตอบอื่น ๆ ซุปเปอร์ implementable ได้อย่างง่ายดายโดยใช้ฟังก์ชั่นที่มีเอาท์พุท เช่น

  func twoDecimals(number: Float) -> String{
    return String(format: "%.2f", number)
}

ด้วยวิธีนี้ทุกครั้งที่คุณต้องการรับค่าเป็นทศนิยม 2 ตำแหน่งคุณก็พิมพ์

twoDecimals (' หมายเลขของคุณที่นี่ ')

...

ซิมเปิ้ล!

Ps คุณยังสามารถทำให้มันส่งคืนค่าFloatหรืออะไรก็ได้ที่คุณต้องการโดยการแปลงอีกครั้งหลังจากการแปลง String ดังนี้:

 func twoDecimals(number: Float) -> Float{
    let stringValue = String(format: "%.2f", number)
    return Float(stringValue)!
}

หวังว่าจะช่วยได้



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.