2013-09-03 4 views
0

В моем приложении у меня есть поле количества. В поле суммы пользователь может ввести любое число цифр после десятичной точки. Но когда я его сохраню, он хочет округлить до двух цифр. этот сценарий работает правильно с моим кодом. С моим кодом, если пользователь вводит значение 2.445, он сохраняется как 2.45. Точно так же
2,115 -> 2,12,
2,125 -> 2,13,
2.135-> 2.14,
2,145 -> 2,15,
2,155 -> 2,16,
2,165 -> 2,17,
2,175 -> 2,18 НО если пользовательский ввод 2.185, в этом случае мне нужно сохранить как 2.19, но он будет сохранен только в 2.48. А также, если ввод равен 2.195, его следует сохранить как 2.20, но он будет сохранен только как 2.19 .. Как это исправить ..? Я прикрепил свой код.Завершение выпуска + ios

float Rate_int = [AmountValue floatValue]; 

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
[formatter setRoundingMode: NSNumberFormatterRoundHalfUp]; 
[formatter setMaximumFractionDigits:2]; 

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

Короче говоря, я хочу сгонять во всех случаях, если третья цифра больше или равна 5 .. но +2,185 не получает округляется до 2,9 .. тоже 2,195 не получает округлая до 2.20 .. у меня есть проблема только в этих двух случаях ..

+0

Это не очень понятно, в каких случаях вы хотите округлить и которые вы не – Paddyd

+0

я хочу сгонять во всех случаях если 3-я цифра больше или равна 5 .. но 2.185 не округляется до 2.9. Аналогично 2.195 не округляется до 2.20. У меня проблема только в этих двух случаях. – Mano

+0

Ok i теперь понимаю. То, как вы это сформулировали, изначально меня отключили. – Paddyd

ответ

3

Использование% .2f

NSString *strNum = [NSString stringWithFormat:@"%.2f",2.185]; 
NSLog(@"%@",strNum); 

или до знаков после запятой

float roundToTwo (float num) 
{ 
    return round(100 * num)/100; 
} 
+0

Для ввода '2.195' это выведет' 2.19', а не '2.2' , Проблема заключается в том, что ни float, ни double не могут хранить число, подобное «2.185» или «2.195» правильно. –

0

Это проблема точности поплавка. Вы можете избежать этой проблемы, используя double вместо float.

double Rete_int = [AmountValue doubleValue]; 
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
    [formatter setRoundingMode: NSNumberFormatterRoundHalfUp]; 
    [formatter setMaximumFractionDigits:2]; 
    [formatter setMinimumFractionDigits:2]; 

    NSString *numberString = [formatter stringFromNumber:[NSNumber numberWithDouble:Rete_int]]; 
+1

Это интересно. Для ввода '2.195',' Rete_int = 2.19499999999999984013', потому что даже double не может точно представлять это число. Поэтому я ожидал, что это число округлено * вниз * до «2.19». Но ваш код дает «2.20» ... странно. –

2

2.185 не может быть представлен в точности в виде двоичного числа с плавающей запятой. Для точной десятичной арифметики, вы должны избегать float или double и использовать NSDecimalNumber вместо:

NSString *AmountValue = @"2.185"; 
NSDecimalNumber *decnum = [NSDecimalNumber decimalNumberWithString:AmountValue]; 

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
[formatter setRoundingMode: NSNumberFormatterRoundHalfUp]; 
[formatter setMaximumFractionDigits:2]; 

NSString *numberString = [formatter stringFromNumber:decnum]; 
// gives "2.19" 

 Смежные вопросы

  • Нет связанных вопросов^_^