Преобразовать float в float и обрезать после двух десятичных знаков Objective-C

У меня есть float var1 = cashInHandAmount = 4.73000002 Я просто хочу, как: var2 = 4.73.

Я пытался так:

NSString *floatString = [NSString stringWithFormat:@"%.02f",cashInHandAmount];//it prints 4.73
[self.editcash setMaxValue:[floatString floatValue]];//but it again sets 4.73000002 why?

Ребята, не могли бы вы помочь мне с этим?

4 ответа

%f просто округляет результат. Преобразование значения с плавающей запятой в строку и обратно не работает, если точное значение (например, 4,73) не имеет представления в формате с плавающей запятой. Таким образом, преобразование его обратно "округлит" сохраненное значение 4.73 в формат с плавающей запятой, который, очевидно, равен 4.730…02.

Вы должны редко использовать (бинарные, IEEE) числа для финансовых расчетов. Финансовая стоимость (сумма денег) в большинстве случаев представляет собой интегральную стоимость центов, но не является плавающей стоимостью в долларах (или чем-то еще). Кроме того, вы можете подумать об использовании NSDecimal а также NSDecimalNumber чтобы гарантировать, что каждое значение с двумя цифрами точности может быть сохранено в формате.

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

float f = 4.73000002;
float rounded = roundf(f * 100.0f) / 100.0f;
NSLog(@"%10.10f", rounded);

выходы:

2014-07-01 10: 25: 48.653 xctest [596: 303] 4.7300000191

Это сложно проверить, но, вероятно, float не может точно представлять 4.73. Ближайшее представимое значение - 4.7300000191. Это то, что я сказал: округленное десятичное представление не всегда является возможным представлением "двоичного числа с плавающей запятой". Вы столкнетесь с этой проблемой со многими ценностями.

Попробуй это:

    float var1 = 4.73000002;
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    formatter.numberStyle = NSNumberFormatterDecimalStyle;
    formatter.maximumFractionDigits = 2;  //Set number of fractional digits

    NSNumber *num = [NSNumber numberWithFloat:var1];

    NSString *roundedNum = [formatter stringFromNumber:num];

    DLOG(@"Answer : %@", roundedNum);

Если вы хотите усечь все остальные десятичные дроби, вы можете объявить простой метод, подобный этому:

- (float)sanitizeFloat:(float)value
{
    float newValue = [[NSString stringWithFormat:@"%.2f",value] floatValue];
    return newValue;
}

а потом

float aFloat = 45.070809;
NSLog(@"%f",[self sanitizeFloat:aFloat]);

В твоем случае:

[self.editcash setMaxValue:[self sanitizeFloat:cashInHandAmount]];

Выход будет 45.070000

Если вы работаете с денежными суммами с фиксированными десятичными разрядами, вы всегда должны использовать NSDecimal или же NSDecimalNumber - вы не должны использовать поплавки вообще, так как они неточны.

Вы можете использовать:

-[NSDecimalNumber decimalNumberWithString:]

создать свой номер, и есть много методов для работы с NSDecimalNumbers - увидеть документы Apple или NSDecimalNumber.h для деталей.

Другие вопросы по тегам