2 ondalık basamağa çift yuvarlayın


88

currentRatioİki ondalık basamağa nasıl yuvarlayabilirim ?

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

Yalnızca currentRatioiki ondalık basamağa mı yoksa her zaman yukarı yuvarlamak mı istiyorsunuz? Ör: 3.141 -> 3.14 veya 3.141 -> 3.14 ister misiniz?
JAL

Merhaba JAL, 3.149'un 3.15 olarak görüntülenmesini istiyorum. Ancak 3.141, 3.14 göstermelidir. Teşekkürler
Del Hinds

Doğru yuvarlama için cevabımın ilk bölümüne bakın.
JAL

Yanıtlar:


174

İki ondalık basamağa yuvarlak up bir biçim dizesi kullanın ve dönüştürmek doublea String:

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

Misal:

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

Son ondalık hanenizi yuvarlamak istiyorsanız, şöyle bir şey yapabilirsiniz (Phoen1xUK teşekkürler):

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

İki ondalık basamağa yuvarlanırsa 3,15 olması gerekir.
Matt Le Fleur

OP'nin, gerektiğinde yukarı veya aşağı yuvarlayarak iki ondalık basamağa yuvarlamak istediğini düşündüm. Sadece açıklama isteyen bir yorum ekledim.
JAL

Merhaba Jal, Teşekkürler, aşağıdaki gibi ufak bir değişiklikle işe yarayan cevabınızı kullandım: - _ = Çift (rxCurrentTextField.text!)! / Çift (txCurrentTextField.text!)! railRatioLabelField.text! = String (format: "% .2f", currentRatio)
Del Hinds

2
Bu yanıt şu sorudur: "Metin etiketinde iki basamaklı çift nasıl görüntülenir" veya "... dize olarak", bu yanıt "
İkiye

@JAL Noktadan sonra olny .5 veya 0'a ihtiyacım var Örn.
guru

33

(Swift 4.2 Xcode 11) Kullanımı basit Uzantı: -

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

Kullanım: -

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

Parlak. Aslında aynı mülke dönüştürmek istedim (çift). Uzantınız sorunumu çözdü. Teşekkür ederim!
Marcelo dos Santos

:-) Mutlu kodlama
Mehul

Bence seninki doğru cevap. Sadece func'a bir sözdizimi değişikliği eklemek istiyorum. func round(to places: Int) -> Double {
23inhouse

1
@ 23inhouse, cevabı önerilerinize göre güncelledim. Teşekkürler
Mehul

29

SWIFT 4'e güncellendi ve soru için doğru cevap

2 ondalık basamağa yuvarlamak istiyorsanız, 100 ile çarpmanız, ardından yuvarlamanız ve ardından 100'e bölmeniz gerekir.

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

1
Merhaba - Hesaplamanızı belirli sayıda ondalık döndürme açısından nasıl yaptığınızı anlamıyorum. Ya 3 ondalık basamak döndürmesini istersem?
Sipho Koza

@SiphoKoza bunu 1000 ile çarp ve sonra 1000'e böl
Chetan Rajagiri

Bu gerçekten "doğru" cevap değil çünkü dahili olarak, sayı kayan noktada kaydedilir, 2 tabanı ve siz 10 tabanlı bir sayıyı temsil etmeye çalışıyorsunuz. Bazı sayılar için kesin bir gösterim yoktur ve değeri yazdırmaya gittiğinizde çok fazla basamakla karşılaşırsınız. Doğru cevap, Double veya Float değil, bir dize döndürmelidir.
Victor Engel

@levan Sıfır için de işe yarıyor, sadece çifte olduğundan emin olun
Chetan Rajagiri

1
Harika cevap, bence kabul edilen cevap bu olmalı.
אורי orihpt

15

Bu amaçla NumberFormatter kullanmayı düşünün, oranın yüzde işaretini yazdırmak istiyorsanız veya para birimi ve büyük sayılar gibi şeyleriniz varsa daha fazla esneklik sağlar.

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

Birçoğundan geçtim, bu UZAKTAN, EN İYİ çözüm! Çok teşekkür ederim!
kalafun

13

Double'ı birden çok kez biçimlendirmek istiyorsak yukarıdaki yanıta ekleyerek, aşağıdaki gibi Double'ın protokol uzantısını kullanabiliriz:

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

let a = 45.666

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

1
Yazdırılmamalı (a.dollarString)?
glm4

4

Ondalık sayılardan sonraki belirli rakamlar için kod:

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

Burada% .2f, swift'e bu sayıyı 2 ondalık basamağa yuvarlamasını söyler.


4

@Rounded , Hızlı bir 5.1 özellik sarmalayıcı Örnek:

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
String(format: "%.2f", Double(round(1000*34.578)/1000))

Çıktı: 34.58


2

Benim gibi çaylaklar için hızlı bir takip cevabı:

Çıktılı bir işlev kullanarak diğer yanıtları çok kolay uygulanabilir hale getirebilirsiniz . Örneğin

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

Bu şekilde, sadece yazdığınız 2 ondalık basamağa bir değer almak istediğinizde

twoDecimals (' Numaranız burada ')

...

Basit!

Ps Ayrıca , String dönüşümünden sonra aşağıdaki gibi tekrar dönüştürerek bir Float değeri veya istediğiniz herhangi bir şeyi döndürmesini sağlayabilirsiniz :

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

Umarım yardımcı olur.


-1

234.545332233 verirseniz size 234.54 verir

let textData = Double(myTextField.text!)!
let text = String(format: "%.2f", arguments: [textData])
mylabel.text = text

-4

Yalnızca tek satırlık kod:

 let obj = self.arrayResult[indexPath.row]
 let str = String(format: "%.2f", arguments: [Double((obj.mainWeight)!)!])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.