Округлить двойное значение до 2 знаков после запятой

87

У меня двойное значение 22.368511, я хочу округлить его до двух знаков после запятой. т.е. он должен вернуть 22,37

Как я могу это сделать?

testndtv
источник
1
Вы хотите вернуть это значение с двумя десятичными знаками? или отображать значение с 2-мя десятичными знаками?
thelaws
На самом деле мне просто нужно отобразить это
testndtv

Ответы:

189

Как и в большинстве языков, формат

%.2f

вы можете увидеть больше примеров здесь


Изменить : я также получил это, если вас беспокоит отображение точки в случаях 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
На iOS мне пришлось использовать setPositiveFormat:, потому что setFormat:метода не существовало (определено только для Mac), но все же - отличный ответ, сэкономивший мне часы экспериментов, так что +1 и большое вам спасибо :)
FurloSK
1
Одна проблема: он не округляется, а обрезается. Предположительно, используя входное значение, предоставленное вопрошающим вместе с вашим кодом, результат будет не таким, как он ожидал (22.37) - скорее (22.36).
Джеймс Буш
Но вы не можете использовать его для дальнейших расчетов
Параг Бафна 03
70

Вы можете использовать приведенный ниже код, чтобы отформатировать его до двух десятичных знаков.

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
В Swift 4: let str = String (описывает: formatter.string (from: 12.2345)!)
yehyatt 08
Возможно ли, чтобы значение результата не увеличивалось с 6 до 7 в 22,36?
Шахбаз Акрам
@ShahbazAkram Да. RoundingMode также имеет множество других опций, например, NSNumberFormatterRoundDown, NSNumberFormatterRoundHalfDown и т. Д.
Абдуррахман Мубин Али 08
30
 value = (round(value*100)) / 100.0;
Krafter
источник
5
Я считаю, что это наиболее правильный ответ - он попросил просто округлить его, а не преобразовывать в строку в конце (или потом делать двойное преобразование обратно в двойное).
Мартин Ковачев
11

В Swift 2.0 и Xcode 7.2:

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

Пример:

введите описание изображения здесь

Клаудио Гуйрунас
источник
11

Вы можете использовать функцию NSDecimalRound

Фруктовый Компьютерщик
источник
это полезно, если вы округляете значение (о чем я тоже подумал сначала), но комментарии показывают, что hmthur wats управляет только отображением ...
Джейсон Роджерс
6

Чтобы удалить десятичные дроби из двойника, взгляните на этот вывод

Obj C

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

Результат будет:

10.02 
10

Swift 2.1 и 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))

Результат будет:

3.14 
3
Раду Урсаке
источник
4

Я собирался пойти с ответом Джейсона, но заметил, что в моей версии Xcode (4.3.3) я не мог этого сделать. поэтому после небольшого исследования я обнаружил, что они недавно изменили методы класса и удалили все старые. так вот как мне пришлось это сделать:

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

[fmt setMaximumFractionDigits:2];
NSLog(@"%@", [fmt stringFromNumber:[NSNumber numberWithFloat:25.342]]);
Кит Рамос
источник
2

Используйте NSNumber * aNumber = [NSNumber numberWithDouble: number]; вместо 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
источник
2

Для Swift есть простое решение, если вы не можете импортировать Foundation, использовать round () и / или не хотите String (обычно в случае, когда вы находитесь в Playground):

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

результат: 31.726

Паула Хастентойфель
источник
1

Я использую решение, опубликованное Умберто Раймонди, расширяющее тип Double:

extension Double {
    func roundTo(places:Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return (self * divisor).rounded() / divisor
    }
}
Матиас Массо
источник
0

Вы могли сделать это:

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

// test
NSNumber* a = @12;
NSString* s = [f stringFromNumber:a];
NSLog(@"%@", s);
Хоанг Минь
источник