4

我有一个存储 textfield.text 输入的数组。然后我将其他地方的文本作为浮点数检索。这似乎给了我文本字段中的“确切数字”。

示例 A

   navtestAppDelegate *appDelegate = 
   (navtestAppDelegate *)[[UIApplication 
    sharedApplication] delegate];

NSMutableArray *storedData = 
 appDelegate.myData;

[storedData replaceObjectAtIndex: myIndex withObject: mytextfield.text];

float number = [[storedData objectAtIndex:myIndex] floatValue];

如果mytextfield.text input is 22.8,float number返回22.8

然而,

示例 B

[storedData replaceObjectAtIndex: myIndex withObject: @"22.8”];

float number  = [[storedData objectAtIndex:myIndex] floatValue];

float number返回22.7999999

我不明白为什么我在示例 A 中得到了确切的数字

4

2 回答 2

0

值 22.8 不能精确地用二进制浮点数表示。您看到的是基于显示格式的表示。不同的显示方式可能使用不同的显示格式。显示不同的位数和四舍五入意味着 22.8 和 22.7999999 对于四舍五入后显示的位数都是正确的。请注意,显示的是 22.7999999 而不是 22.8000000,因为下一个数字是 2,因此显示的值向下舍入。

这取决于基数,也就是说,可以在一个数字基数中精确的事物可能无法在不同的数字基数中精确。在这种情况下,十进制数基数中的 22.8 不能与二进制数基数精确。

这就是 NSDecimal 存在的原因,也是浮点不用于货币值的原因。

这有点等价于以十进制为基数显示 pi 的值,位数是无限的,因此对于每次显示,有人决定要显示多少位数。有趣的是,pi 可以精确地(但有用地)以 pi 数基数表示。:-)

在 和 的情况下floatdouble可以表示的位数是有限的。

于 2013-11-07T01:00:02.930 回答
0

试试这样: -

[storedData replaceObjectAtIndex: myIndex    
 withObject: [NSNumber 
 numberWithFloat:22.8]];
于 2013-11-07T02:52:10.267 回答