回合问题+ ios

时间:2013-09-03 11:01:15

标签: iphone ios nsnumber nsnumberformatter

在我的应用中,我有一个金额字段。在金额字段中,用户可以在小数点后输入任意数量的位数。但是当我保存它时,它想要舍入到2位数。此方案适用于我的代码。使用我的代码,如果用户输入值2.445,则保存为2.45。同样
2.115 - > 2.12,
2.125 - > 2.13,
2.135-> 2.14,
2.145 - > 2.15,
2.155 - > 2.16,
2.165 - > 2.17,
2.175 - > 2.18 BUT 如果用户输入是2.185,在这种情况下我需要保存为2.19但它仅保存为2.48。而且如果输入是2.195,它应该保存为2.20但它只保存为2.19 ..如何解决这个问题?我附上了我的代码。

float Rate_int = [AmountValue floatValue];

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setRoundingMode: NSNumberFormatterRoundHalfUp];
[formatter setMaximumFractionDigits:2];

NSString *numberString = [formatter stringFromNumber:[NSNumber numberWithFloat:Rate_int]];

简而言之,如果第三位数大于或等于5,我想在所有情况下进行四舍五入..但2.185不会四舍五入到2.9 ..同样2.195不会四舍五入到2.20。我只在这两种情况下遇到问题..

3 个答案:

答案 0 :(得分:3)

使用%。2f

NSString *strNum = [NSString stringWithFormat:@"%.2f",2.185];
NSLog(@"%@",strNum);

或最多小数位

 float roundToTwo (float num)
{
    return round(100 * num) / 100;
}

答案 1 :(得分:2)

2.185不能完全表示为二进制浮点数。 对于精确的十进制算术,您应该避免floatdouble,并使用 NSDecimalNumber代替:

NSString *AmountValue = @"2.185";
NSDecimalNumber *decnum = [NSDecimalNumber decimalNumberWithString:AmountValue];

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setRoundingMode: NSNumberFormatterRoundHalfUp];
[formatter setMaximumFractionDigits:2];

NSString *numberString = [formatter stringFromNumber:decnum];
// gives "2.19"

答案 2 :(得分:0)

这是一个浮点精度问题。您可以使用double而不是float来避免此问题。

    double Rete_int =  [AmountValue doubleValue];
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
    [formatter setRoundingMode: NSNumberFormatterRoundHalfUp];
    [formatter setMaximumFractionDigits:2];
    [formatter setMinimumFractionDigits:2];

    NSString *numberString = [formatter stringFromNumber:[NSNumber numberWithDouble:Rete_int]];