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

示例

   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

我不明白为什么我在示例中获得确切的编号

有帮助吗?

解决方案

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

这是基础依赖性的,这就是一个数字库中可能确切的事情,可能无法在不同的数字库中确切。在这种情况下,十进制数中的22.8在二进制数库中不能精确。

这就是存在NSDECIMAL的原因,原因是货币值不使用浮点。

这在某种程度上等同于在基本小数中显示PI的值,数字的数量是无限的,因此对于每个显示器,有人决定要显示多少位数字。有趣的是,PI可以在PI数基库中准确表示(但有用)。 :-)

如果是 floatdouble 可以表示有限数字。

其他提示

尝试这样: -

[storedData replaceObjectAtIndex: myIndex    
 withObject: [NSNumber 
 numberWithFloat:22.8]];
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top