Преобразовать 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
для деталей.