Как можно округлить значение с плавающей запятой до двух десятичных позиций после запятой? - PullRequest
12 голосов
/ 06 мая 2009

Я получил значение с плавающей точкой от акселерометра, который выглядит следующим образом:

-3,04299553323

Я бы хотел получить -3.04, например. Есть ли простой способ округлить значение с плавающей запятой?

Редактировать:

Округление чисел в Objective-C

Ответы [ 4 ]

39 голосов
/ 21 апреля 2013

Я знаю, что это старый пост, но на всякий случай кто-то другой ищет быстрый двухшаговый вариант.

float old = -3.04299553323;  
float new = [[NSString stringWithFormat:@"%.2f",old]floatValue];

Результат = -3.04

@ "%. 2f" округляется до двух десятичных знаков. Если вам нужны три знака после запятой, введите @ "%. 3f" и так далее.

Надеюсь, это поможет!

32 голосов
/ 13 июля 2011

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

float rounded = roundf(orig * 100) / 100.0;

или аналогичный вернет точный ответ.

Действительно, в общем, не будет. Например, рассмотрим

float f = 123456.3;
float r = roundf(f * 100) / 100.0;

printf("%.2f, %.10f\n", r, r);

который выводит

123456.30, 123456.2968750000

Oops!

Использование double вместо float помогает, но даже в этом случае, если мы немного изменим код, вы увидите, что это на самом деле не решает проблему:

double f = 123456.3;
double r = round(f * 100) / 100.0;

printf("%.2f, %.20f\n", r, r);

Опять получаем

123456.30, 123456.30000000000291038305

, что довольно ясно показывает, что оно не совсем округлено.

В любом случае, мораль этой истории заключается в том, что такие вещи, как round(f * 100) / 100.0 только раунды приблизительно . В некоторых случаях это может быть достаточно хорошо, но вы должны помнить, что результат не является действительно округленным.

Если вы хотите что-то лучше, вам нужно вместо этого использовать десятичную арифметику. Вы можете сделать это, сохраняя свои значения в виде целых чисел (например, для валютных значений, храните их в пенсах или центах вместо фунтов или долларов), или используя один из различных десятичных пакетов с плавающей запятой, которые вы можете найти в десятичной системе Википедии Страница с плавающей точкой .

1 голос
/ 09 января 2015

Я просто опубликовал свой ответ на этот вопрос, потому что это был единственный способ для меня, чтобы это работало быстро, когда я объединил два из данных ответов, чтобы отобразить округленное значение с плавающей запятой для пользователя в приложении для iPad:

NSString *roundedAmount = [NSString stringWithFormat:@"%.2f", round ((floatValue / 1024) * 100.0) / 100.0];
1 голос
/ 06 мая 2009

Умножьте его на 100 (округлите вверх / вниз до ближайшего целого числа, если необходимо), возьмите целочисленную часть, затем снова разделите на 100

Применяется для любого числа знаков после запятой, умножить / разделить на 10 ^ (число десятичных знаков).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...