0

在我的应用程序中,我有一个金额字段。在金额字段中,用户可以输入小数点后的任意位数。但是当我保存它时,它想四舍五入到 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但是如果用户输入是 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]];

简而言之,如果第 3 位大于或等于 5,我想在所有情况下四舍五入。但是 2.185 没有四舍五入到 2.9 .. 同样 2.195 也没有四舍五入到 2.20 .. 我有仅在这两种情况下有问题..

4

3 回答 3

3

使用 %.2f

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

或小数点后

 float roundToTwo (float num)
{
    return round(100 * num) / 100;
}
于 2013-09-03T11:17:59.103 回答
2

2.185不能完全表示为二进制浮点数。对于精确的十进制算术,您应该避免floator doubleNSDecimalNumber而是使用:

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"
于 2013-09-03T11:47:00.483 回答
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]];
于 2013-09-03T11:31:09.803 回答