NSNumber 丢失十进制数字

Posted

技术标签:

【中文标题】NSNumber 丢失十进制数字【英文标题】:NSNumber lose decimal digits 【发布时间】:2013-05-20 17:56:48 【问题描述】:

我需要将浮点数保存到 NSNumber(名为ordered.value 的变量)中。 问题是在转换过程中十进制数字被设置为零。

我还添加了 3 个版本的变量的日志,因此您可以看到原始浮点数是正确的。然后 NSNumber 丢失了十进制数字。

这是我的第一次尝试(更简单的版本):

ordered.value = [NSNumber numberWithFloat:[o.valore floatValue]];
NSLog(@"%f,%f",[o.valore floatValue],[ordered.value floatValue]);

但我仍然丢失了十进制数字。 日志:

2013-05-20 20:05:19.617 Piazzetta[9636:c07] 232.179993,232.000000
2013-05-20 20:05:19.617 Piazzetta[9636:c07] 20159.490234,20159.000000
2013-05-20 20:05:19.618 Piazzetta[9636:c07] 16.540001,16.000000

这是我的第二次尝试(使用 NSNumberFormatter)

NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
ordered.value = [f numberFromString:o.valore];
NSLog(@"%f,%f",[o.valore floatValue],[ordered.value floatValue]);

日志:

2013-05-20 20:16:22.781 Piazzetta[9951:c07] 232.179993,232.000000
2013-05-20 20:16:22.782 Piazzetta[9951:c07] 20159.490234,20159.000000
2013-05-20 20:16:22.782 Piazzetta[9951:c07] 16.540001,16.000000

【问题讨论】:

在屏幕截图中看不到任何内容。如果您希望我们阅读,请发布代码。 为什么要将o.valore 从浮点数转换为字符串然后再转换回来?如果这不是您的应用程序的工作方式,请告诉我们实际上下文是什么,以便我们更好地了解您要完成的工作。 您正在以一种奇怪的方式创建ordered.value(正如@bdesham 指出的那样,转到一个字符串并再次返回)但是您的NSLog 的输出表明o.valore 已经 i> 小数点后全为零。请发布一些代码,包括设置o.valore 值的代码。 o.valore 是什么类? 什么是ordered?您是否碰巧在该类中为value 编写了自己的getter(即您是否有一个名为value 的方法)?如果是这样,您可能应该注释掉该方法并利用标准的合成访问器方法。 【参考方案1】:

我刚刚尝试了您的代码的简化版本:

NSString *valore = @"232.179993";
NSNumber *ordered = [NSNumber numberWithFloat:[valore floatValue]];
NSLog(@"Results: %f,%f",[valore floatValue],[ordered floatValue]);

按预期工作:

// Results: 232.179993,232.179993

这让我相信它正在您的 ordered 对象中被修改(可能通过您的 value 属性的 setter 或 getter)。

如果您无法追踪到,请发布 setter 和/或 getter 的代码,我们可以看看。

【讨论】:

问题解决:Ordered 是CoreData 实体的一个类,value 是一个属性,这就是我的NSNumber 的原因。我忘了在 CoreData 上设置 Float。

以上是关于NSNumber 丢失十进制数字的主要内容,如果未能解决你的问题,请参考以下文章

将 NSString 转换为 NSNumber 会导致数字过多和奇怪的舍入

关于js中小数运算丢失精度的处理办法

具有语言环境和指数的 NSNumber

如何比较十进制值

数字逻辑8421BCD码换成十进制和二进制数

怎么把数字转为二进制数