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ć?


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

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)

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;

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



11

Możesz użyć funkcji NSDecimalRound


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

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]]);

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;
}

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


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
    }
}

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);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.