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.