#iphone #floating-point #truncate
#iPhone #с плавающей запятой #усечение
Вопрос:
Мне нужно просто усечь число с плавающей запятой (усечь, а не округлять его).
float FloatNum = 43.6823921;
NSString *numString = [NSString stringWithFormat:@"%.1f", FloatNum]; // yields 43.7
Комментарии:
1. Он хочет 43.6 (не округление, просто усечение)
Ответ №1:
Есть много способов, которые вы можете сделать, но ваше решение будет зависеть от ряда факторов.
Это всегда будет усекаться до десятых долей.
float floatNum = 43.6823921;
float truncatedFloat = truncf(floatNum * 10) / 10;
Как упоминал чаун, вы можете преобразовать его в строку и взять подстроку. Возможно, вы захотите использовать rangeOfString:
os something для поиска десятичной дроби, если вы не всегда имеете дело с двузначными числами.
Другим вариантом было бы использовать NSDecimalNumber
метод with it decimalNumberByRoundingAccordingToBehavior:
для явной настройки округления. Я несколько раз использовал эту опцию для обработки валютных операций, где точность очень важна.
float num = 43.6894589;
NSDecimalNumber *decimalNumber = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithFloat:num] decimalValue]];
float truncatedFloat = [[decimalNumber decimalNumberByRoundingAccordingToBehavior:self] floatValue];
// NSDecimalNumberBehaviors
- (NSDecimalNumber *)exceptionDuringOperation:(SEL)method error:(NSCalculationError)error leftOperand:(NSDecimalNumber *)leftOperand rightOperand:(NSDecimalNumber *)rightOperand {
return [NSDecimalNumber notANumber];
}
- (short)scale {
return 1;
}
- (NSRoundingMode)roundingMode {
return NSRoundDown;
}
Ответ №2:
Это преобразует значение с плавающей запятой в строку, возвращает подстроку с индексом 4, преобразует обратно в число с плавающей запятой. Я думаю, что это обычный способ усечения числа с плавающей запятой без округления вообще : float myTruncatedFloat = [[[[NSNumber numberWithFloat:43.6823921] stringValue] substringToIndex:4] floatValue];
. Это преобразуется 43.6823921
в 43.68
.
float myfl = 43.6823921;
NSNumber *num = [NSNumber numberWithFloat:myfl];
NSString *numStr = [num stringValue];
NSLog(@"%@", numStr);
NSLog(@"%@", [numStr substringToIndex:2]);
NSLog(@"%@", [numStr substringToIndex:3]);
NSLog(@"%@", [numStr substringToIndex:4]);
NSLog(@"%@", [numStr substringToIndex:5]);
NSLog(@"%@", [numStr substringToIndex:6]);
NSLog(@"%@", [numStr substringToIndex:7]);
NSLog(@"%@", [numStr substringToIndex:8]);
float newMyFloat = [[numStr substringToIndex:4] floatValue];
NSLog(@"%.1f", newMyFloat);
newMyFloat = [[numStr substringToIndex:5] floatValue];
NSLog(@"%.2f", newMyFloat);
С принтами:
[AppDelegate application:didFinishLaunchingWithOptions:]: 43.68239
[AppDelegate application:didFinishLaunchingWithOptions:]: 43
[AppDelegate application:didFinishLaunchingWithOptions:]: 43.
[AppDelegate application:didFinishLaunchingWithOptions:]: 43.6
[AppDelegate application:didFinishLaunchingWithOptions:]: 43.68
[AppDelegate application:didFinishLaunchingWithOptions:]: 43.682
[AppDelegate application:didFinishLaunchingWithOptions:]: 43.6823
[AppDelegate application:didFinishLaunchingWithOptions:]: 43.68239
[AppDelegate application:didFinishLaunchingWithOptions:]: 43.6
[AppDelegate application:didFinishLaunchingWithOptions:]: 43.68
Комментарии:
1. Это один из способов. Есть ли способ фактически усечь само значение с плавающей запятой без округления?
2. Это преобразует значение с плавающей запятой в строку, возвращает подстроку с индексом 4, преобразует обратно в число с плавающей запятой. Я думаю, что это обычный способ усечения числа с плавающей запятой без округления вообще :
float myTruncatedFloat = [[[[NSNumber numberWithFloat:43.6823921] stringValue] substringToIndex:4] floatValue];
. Это преобразуется43.6823921
в43.68
.