iPhone: Как обрезать поплавок без округления? - PullRequest
1 голос
/ 07 октября 2011

Мне нужно просто обрезать число с плавающей запятой (обрезать, а не округлять его).

float FloatNum = 43.6823921;
NSString *numString = [NSString stringWithFormat:@"%.1f", FloatNum]; // yields 43.7

Ответы [ 2 ]

2 голосов
/ 08 октября 2011

Есть много способов, которые вы можете сделать, но ваше решение зависит от ряда факторов.

Это всегда будет сокращаться до десятого места.

float floatNum = 43.6823921;
float truncatedFloat = truncf(floatNum * 10) / 10;

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

Другой вариант - использовать NSDecimalNumber с его методом 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;
}
1 голос
/ 07 октября 2011

Это преобразует число с плавающей точкой в ​​строку, возвращает подстроку к индексу 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
...