Подтвердить что ты не робот

IOS Objective-C Как получить 2 десятичное округленное значение поплавка?

У меня есть

float a = 1412.244019;

и мне нужно округлить до ближайшего второго десятичного знака, например 1412.24000000. Я понимаю, что если я хочу представить a только с двумя десятичными знаками, я использую%.2f, но это не так. Мне нужен новый а по математическим соображениям как плавающий.

Я попробовал несколько методов, найденных в stackoverflow без везения. Более очевидный, который я использовал, я упоминал ниже, но до сих пор не повезло использовать его. Можете ли вы понять, почему магия не происходит?

PS: Он иногда делает желаемый эффект, НЕ всегда, что заставляет меня думать... хммм...

Спасибо заранее.

код:

float a = 1412.244019;
NSLog(@"a is %f", a); //output a is 1412.244019
a = [[NSString stringWithFormat:@"%.2f", a] floatValue];
NSLog(@"a is %f", a); //output a is 1412.239990

EDIT:

СМОТРЕТЬ, например, когда я использую float a после вышеупомянутой операции, он рассматривает это как 1412.240000, хотя NSLog говорит по-другому... странно. Но я получаю то, что хочу, поэтому Kudos за потраченное впустую время не преследует ничего:)

РЕДАКТИРОВАТЬ Я хотел бы выбрать вас всех как правильные ответы, но так как я могу выбрать только один, я выбрал первый хороший ответ с дополнительным объяснением (из двух последних).

4b9b3361

Ответ 1

Вы пробовали это?

CGFloat val = 37.777779;

CGFloat rounded_down = floorf(val * 100) / 100;   /* Result: 37.77 */
CGFloat nearest = floorf(val * 100 + 0.5) / 100;  /* Result: 37.78 */
CGFloat rounded_up = ceilf(val * 100) / 100;      /* Result: 37.78 */

source: Число округлений до 2 десятичных мест в C

Дополнение: у вас просто нет контроля над тем, как компьютер будет хранить значение float.

Таким образом, эти округленные значения могут быть НЕ ТОЛЬКО "очевидными" десятичными значениями, но они будут очень близки и что максимальная гарантия у вас будет.

Ответ 2

Вы делаете это в Objective-C точно так же, как и в C:

double notRounded = ...;
double rounded = round (notRounded * 100.0) / 100.0;

Не используйте float - если вы не можете объяснить кому-то, каковы ваши конкретные причины использовать float в double. float имеет очень ограниченную точность. И использование потолка или пола является глупым, так как существует прекрасная стандартная функция, называемая "круглой".

Ни float, ни double не могут точно представлять большинство десятичных значений, например 12.24. Так как он имеет гораздо более высокую точность, двойник позволит вам приблизиться к 12.24. Поэтому есть огромный шанс, что NSLog отобразит некоторое странное число для (float) 12.24, например 12.23999997394 или что угодно, в то время как он может отображать 12.24 для double.

Ответ 3

Самое близкое значение к 1412.24, которое может иметь a float, равно 1412.239990234375. Существует операция нет, которая может создать float ближе, чем это, потому что формат объектов float не представляет никаких более близких значений. Просить представить 1412.24 в float, как просить представить 2.5 в int. Это просто невозможно.

Варианты решения этой проблемы включают:

  • Вы можете использовать форматирование использования, которое отображает "1412.24", без изменения базового объекта float.
  • Вы можете использовать double, чтобы приблизиться (гораздо ближе), но он все равно не будет точно 1412.24.
  • Вы можете масштабировать значения float до отображаемых значений (например, измерять в других единицах, чтобы все значения были точно представлены в float).
  • Вы можете использовать другой тип данных, например NSDecimal.

Ответ 4

Вы можете умножить на 100.0 и, возможно, добавить 0.5 для округления, а затем взять значение int результата. Затем вы можете использовать /100 для получения значения до десятичной точки и% 100 для получения двух знаков после запятой.

Ответ 5

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

Одно из предложений - сделать всю вашу арифметику целым числом, умноженным на 100, а затем делить, когда вы хотите отобразить конечный результат. У вас могут быть слишком большие номера, которые запретили бы это.

Ответ 6

Ошибка в этой строке

a = [[NSString stringWithFormat:@"%.2f", a] floatValue];

исправить его до

a = [NSString stringWithFormat:@"%.02f", a];