【问题标题】:Round off Issue + ios四舍五入问题 + ios
【发布时间】:2013-09-03 11:01:14
【问题描述】:

在我的应用程序中,我有一个金额字段。在金额字段中,用户可以输入小数点后的任意位数。但是当我保存它时,它想四舍五入到 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。 . 我只在这两种情况下有问题..

【问题讨论】:

  • 目前还不清楚哪些案件你要四舍五入,哪些不
  • 如果第 3 位大于或等于 5,我想在所有情况下四舍五入。但是 2.185 没有四舍五入到 2.9.. 同样 2.195 也没有四舍五入到2.20..我只有这两种情况有问题..
  • 好的,我现在明白了。你最初的措辞让我很反感
  • 对不起..现在我也编辑了我的问题..你能给我一些解决方法吗..

标签: iphone ios nsnumber nsnumberformatter


【解决方案1】:

使用 %.2f

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

或小数点后

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

【讨论】:

  • 对于输入 2.195,这将输出 2.19 而不是 2.2。问题是 float 和 double 都不能正确存储 2.1852.195 这样的数字。
【解决方案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"

【讨论】:

    【解决方案3】:

    这是一个浮点精度问题。你可以通过使用 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]];
    

    【讨论】:

    • 这很有趣。对于输入2.195Rete_int = 2.19499999999999984013,因为即使是双精度数也不能精确地表示该数字。所以我本来希望这个数字被四舍五入向下2.19。但是你的代码给了2.20 ...奇怪。
    猜你喜欢
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 2023-01-12
    • 2012-08-05
    • 2018-02-14
    相关资源
    最近更新 更多