【问题标题】:Convert NSString to NSNumber precision issue将 NSString 转换为 NSNumber 精度问题
【发布时间】:2015-01-07 05:43:24
【问题描述】:

我有一个小数点后 7 位的字符串:@"-28.1234212"

我想将其转换为NSNumber 而不会丢失任何精度。当我执行以下操作时,我只得到 4 位小数。

 NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
    [f setNumberStyle:NSNumberFormatterDecimalStyle];
    NSNumber* convertedNum = [f numberFromString:@"-28.1234212"];

现在convertNum 是-28.1234 而不是-28.1234212

是否有可能做到这一点而不会丢失精度?

【问题讨论】:

  • 你确定底层数字实际上已经失去了精度(而不是 NSNumber 只是打印到小数点后 4 位)?
  • 我正在打印和检查调试。
  • 请贴出您用来打印的代码。
  • NSLog(@"%@", convertNum);
  • 另外你不需要使用NSNumberFormatter。这应该可以代替:NSNumber *convertedNum = [NSNumber numberWithDouble:@"-28.1234212".doubleValue]

标签: ios nsstring nsnumber


【解决方案1】:

更改数字格式器样式

   [f setNumberStyle:kCFNumberFormatterNoStyle];

使用 kCFNumberFormatterNoStyle 样式

   NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
    [f setNumberStyle:kCFNumberFormatterNoStyle];
    NSNumber* convertedNum = [f numberFromString:@"-28.1234212"];

    NSLog(@"%@",convertedNum);

【讨论】:

    【解决方案2】:

    如果您正在寻找精度,您可以使用 NSDecimalNumber。

    NSDecimalNumber *convertedNUm = [NSDecimalNumber decimalNumberWithString:@"-28.1234212"]
    

    【讨论】:

      【解决方案3】:
      NSString *nowValue =@"-28.1234212";
      NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
      [f setNumberStyle:kCFNumberFormatterNoStyle];
      NSNumber * nowNum = [f numberFromString:nowValue];
      NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
      [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
      [formatter setMaximumFractionDigits:4]; //set max fraction digit 
      NSNumber *nowValueFormatted = [formatter stringFromNumber:nowNum];
      NSLog(@"%@",nowNum);
      NSLog(@"%@",nowValueFormatted);
      

      这可能对你有帮助:)

      【讨论】:

        【解决方案4】:

        为什么需要格式化程序?可以直接转成NSNumber

        NSString *douStr = @"-28.1234212";
        NSNumber *num = [NSNumber numberWithDouble:douStr.doubleValue];
        

        【讨论】:

          猜你喜欢
          • 2011-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-05
          • 2011-04-27
          • 2010-11-29
          • 1970-01-01
          相关资源
          最近更新 更多