【问题标题】:Cast as an NSNumber doubleValue adding extra [phantom] precision转换为 NSNumber doubleValue 添加额外的 [phantom] 精度
【发布时间】:2010-12-24 13:33:33
【问题描述】:

iPhone sdk 3.2.1

 NSMutableDictionary *myDict = [NSMutableDictionary dictionaryWithCapacity:2];
 [myDict setObject:[NSNumber numberWithDouble:0.1f] forKey:@"testDoubleObject"];
 [myDict setValue:[NSNumber numberWithDouble:0.1f] forKey:@"testDoubleValue"];

将 myDict 的描述打印到控制台会产生以下结果:

myDict 的打印说明: {类型 = 可变,计数 = 2,容量 = 3,对 = ( 0 : {contents = "testDoubleObject"} = {value = +0.10000000149011611938, type = kCFNumberFloat64Type} 1 : {contents = "testDoubleValue"} = {value = +0.10000000149011611938, type = kCFNumberFloat64Type} )}

从字典中拉出双打表明这些幻影数字被保留:

 NSNumber *doubleFromObject = [myDict objectForKey:@"testDoubleObject"];
 NSNumber *doubleFromValue = [myDict valueForKey:@"testDoubleValue"];

打印 doubleFromObject 和 doubleFromValue 会在控制台中生成:

doubleFromObject 的打印说明: {值 = +0.10000000149011611938,类型 = kCFNumberFloat64Type}

doubleFromValue 的打印说明: {值 = +0.10000000149011611938,类型 = kCFNumberFloat64Type}

当我尝试从字符串创建 NSNumber doubleValue 时,也会发生同样的事情:

 NSString *doubleAsAString = @"0.1";
 NSNumber *doubleAsANumber = [NSNumber numberWithDouble:[doubleAsAString doubleValue]];

在控制台中打印 doubleAsANumber 会产生这样的结果:

doubleAsANumber 的打印说明: {值 = +0.10000000000000000555,类型 = kCFNumberFloat64Type}

这些多余的幻影数字给我带来了麻烦。

1) 发生这种情况的原因是什么?

2) 我怎样才能摆脱那些多余的幻影数字?

【问题讨论】:

    标签: iphone sdk double nsnumber number-formatting


    【解决方案1】:

    1.是什么导致这种情况发生?

    您所说的这些“幻像”数字是在base-2 中表示base-10 数字的副产品。

    2。我怎样才能摆脱那些多余的幻影数字?

    摆脱它们的最佳方法是使用固定精度类型,例如NSDecimal

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      • 2020-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多