Zaokrąglij podwójną wartość do 2 miejsc po przecinku

87

Mam podwójną wartość jako 22,368511 i chcę ją zaokrąglić do 2 miejsc po przecinku. tzn. powinien zwrócić 22,37

Jak mogę to zrobić?

testndtv
źródło
1
Czy chcesz zwrócić tę wartość z dwoma miejscami po przecinku? lub wyświetlić wartość z dwoma miejscami po przecinku?
thelaws
Właściwie po prostu muszę to wyświetlić
testndtv

Odpowiedzi:

189

Jak w większości języków format to

%.2f

możesz zobaczyć więcej przykładów tutaj


Edycja : Mam to również, jeśli martwisz się wyświetlaniem punktu w przypadkach 25,00

{
    NSNumberFormatter *fmt = [[NSNumberFormatter alloc] init];
    [fmt setPositiveFormat:@"0.##"];
    NSLog(@"%@", [fmt stringFromNumber:[NSNumber numberWithFloat:25.342]]);
    NSLog(@"%@", [fmt stringFromNumber:[NSNumber numberWithFloat:25.3]]);
    NSLog(@"%@", [fmt stringFromNumber:[NSNumber numberWithFloat:25.0]]);
}
2010-08-22 15:04:10.614 a.out[6954:903] 25.34
2010-08-22 15:04:10.616 a.out[6954:903] 25.3
2010-08-22 15:04:10.617 a.out[6954:903] 25
Jason Rogers
źródło
13
Na iOS musiałem skorzystać setPositiveFormat:, bo setFormat:metody nie było (zdefiniowanej tylko dla Maca), ale mimo to - świetna odpowiedź, zaoszczędziła mi godzin eksperymentowania, więc +1 i wielkie dzięki Tobie :)
FurloSK
1
Jeden problem: nie jest okrągły, ale obcięty. Przypuszczalnie, używając wartości wejściowej dostarczonej przez pytającego wraz z Twoim kodem, wynik nie byłby taki, jakiego oczekiwał (22,37) - raczej (22,36).
James Bush
Ale nie możesz go użyć do dalszych obliczeń
Parag Bafna
70

Możesz użyć poniższego kodu, aby sformatować go do dwóch miejsc po przecinku

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];

[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setMaximumFractionDigits:2];
[formatter setRoundingMode: NSNumberFormatterRoundUp];

NSString *numberString = [formatter stringFromNumber:[NSNumber numberWithFloat:22.368511]];

NSLog(@"Result...%@",numberString);//Result 22.37

Swift 4:

let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.maximumFractionDigits = 2
formatter.roundingMode = .up

let str = String(describing: formatter.string(from: 12.2345)!)

print(str)
Saikiran K
źródło
2
W swift 4: let str = String (opis: formatter.string (od: 12.2345)!)
yehyatt
Czy to możliwe, żeby nie zwiększyć 6 do 7 w wartości 22,36 wyniku?
Shahbaz Akram
@ShahbazAkram Yes. RoundingMode ma również wiele innych opcji, np. NSNumberFormatterRoundDown, NSNumberFormatterRoundHalfDown itp.
Abdurrahman Mubeen Ali
30
 value = (round(value*100)) / 100.0;
krafter
źródło
5
Uważam, że jest to najbardziej poprawna odpowiedź - poprosił, aby ją po prostu zaokrąglić - aby nie konwertować jej na ciąg na końcu (lub później wykonać podwójną konwersję z powrotem na podwójną).
Martin Kovachev
15
[label setText:@"Value: %.2f", myNumber];
TigerCoding
źródło
11

W Swift 2.0 i Xcode 7.2:

let pi:Double = 3.14159265358979
String(format:"%.2f", pi)

Przykład:

wprowadź opis obrazu tutaj

Claudio Guirunas
źródło
11

Możesz użyć funkcji NSDecimalRound

Fruity Geek
źródło
jest to przydatne, jeśli zaokrąglasz wartość (o czym również myślałem na początku), ale komentarze pokazują, że hmthur może kontrolować tylko wyświetlanie ...
Jason Rogers
6

Aby usunąć ułamki dziesiętne z podwójnego, spójrz na ten wynik

Obj C

double hellodouble = 10.025;
NSLog(@"Your value with 2 decimals: %.2f", hellodouble);
NSLog(@"Your value with no decimals: %.0f", hellodouble);

Wynik będzie:

10.02 
10

Swift 2.1 i Xcode 7.2.1

let hellodouble:Double = 3.14159265358979
print(String(format:"Your value with 2 decimals: %.2f", hellodouble))
print(String(format:"Your value with no decimals: %.0f", hellodouble))

Wynik będzie:

3.14 
3
Radu Ursache
źródło
4

Miałem zamiar pójść za odpowiedzią Jasona, ale zauważyłem, że w mojej wersji Xcode (4.3.3) nie mogłem tego zrobić. więc po krótkich badaniach stwierdziłem, że niedawno zmienili metody klas i usunęli wszystkie stare. więc oto jak musiałem to zrobić:

NSNumberFormatter *fmt = [[NSNumberFormatter alloc] init];

[fmt setMaximumFractionDigits:2];
NSLog(@"%@", [fmt stringFromNumber:[NSNumber numberWithFloat:25.342]]);
Kit Ramos
źródło
2

Użyj NSNumber * aNumber = [NSNumber numberWithDouble: number]; zamiast NSNumber * aNumber = [NSNumber numberWithFloat: number];

+(NSString *)roundToNearestValue:(double)number
{
    NSNumber *aNumber = [NSNumber numberWithDouble:number];

    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
    [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
    [numberFormatter setUsesGroupingSeparator:NO];
    [numberFormatter setMaximumFractionDigits:2];
    [numberFormatter setMinimumFractionDigits:0];
    NSString *string = [numberFormatter stringFromNumber:aNumber];        
    return string;
}
Coder_A_D
źródło
2

W przypadku Swift istnieje proste rozwiązanie, jeśli nie możesz zaimportować Foundation, użyj round () i / lub nie chcesz String (zwykle tak jest, gdy jesteś w Playground):

var number = 31.726354765
var intNumber = Int(number * 1000.0)
var roundedNumber = Double(intNumber) / 1000.0

wynik: 31.726

Paula Hasstenteufel
źródło
1

Korzystam z rozwiązania opublikowanego przez Umberto Raimondi rozszerzającego typ Double:

extension Double {
    func roundTo(places:Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return (self * divisor).rounded() / divisor
    }
}
Matias Masso
źródło
0

Możesz to zrobić:

NSNumberFormatter* f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
[f setFormat:@0.00"];

// test
NSNumber* a = @12;
NSString* s = [f stringFromNumber:a];
NSLog(@"%@", s);
Hoang Minh
źródło