Ios 将包含小数点的字符串四舍五入为两位小数

Ios 将包含小数点的字符串四舍五入为两位小数,ios,decimal,Ios,Decimal,给定NSString“1.625”,我想将其四舍五入为“1.63”。 我到底是怎么做到的 这就是我现在拥有的: NSString *rateString = [NSString stringWithFormat:@"%.2f", [@"1.63" doubleValue]]; NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; [f setNumberStyle:NSNumberFormatterDecimalStyle]; ite

给定NSString“1.625”,我想将其四舍五入为“1.63”。 我到底是怎么做到的

这就是我现在拥有的:

NSString *rateString = [NSString stringWithFormat:@"%.2f", [@"1.63" doubleValue]];
NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
item.rate = [f numberFromString:rateString];;
但是,doubleValue将1.625转换为1.624999999
因此,当我用@“%.2f”将它四舍五入到两位小数时,我的结果是1.62

如果你想四舍五入到最接近的百分之一,乘以100,增加0.5,再除以100。然后得到该值的下限

double rate = [@"1.625" doubleValue];
double roundedNumber = floor(rate * 100 + 0.5) / 100;

NSString *rateString = [NSString stringWithFormat:@"%.2f", roundedNumber];
NSLog(@"rate: %@", rateString);
运行此命令,然后输出结果:

2015-01-13 15:41:08.702 Sandbox[22027:883332] rate: 1.63

如果您需要高精度,您真正需要的是
NSDecimalNumber
类,如果不需要配置所有详细信息,则可以与
NSDecimalNumberHandler
类耦合,如果需要绝对控制,则可以与
nsdecimalnumberhaviors
类耦合。这是保留2位十进制数字(handler init中的“scale”值)的最快解决方案:

NSDecimalNumber文档:

NSDecimalNumberHandler文档:

NSDecimalNumberBehaviors文档:

使用
NSDecimalNumber
而不是使用
double
可能重复查找。
NSDecimalNumberHandler *handler = [[NSDecimalNumberHandler alloc]initWithRoundingMode:NSRoundBankers
                                                                                scale:2
                                                                     raiseOnExactness:NO
                                                                      raiseOnOverflow:NO
                                                                     raiseOnUnderflow:NO
                                                                  raiseOnDivideByZero:NO];

[NSDecimalNumber setDefaultBehavior:handler];

NSString *string = @"1.63";
NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:string];