【发布时间】:2012-11-24 14:00:34
【问题描述】:
在我的 iPhone 应用程序中,用户可以在首选项中更改单位(公里或英里)。
[[NSUserDefaults standardUserDefaults] setObject:@"km" forKey:@"distanceUnit"];
或
[[NSUserDefaults standardUserDefaults] setObject:@"mile" forKey:@"distanceUnit"];
我在 Core-Data 中仅以公里为单位保存距离。我使用 int。所以每次我得到距离时,我都会执行以下操作:
if ([unit isEqualToString:@"km"]) {
} else {
intTotalKM = intTotalKM * 0.621371192;
}
在节省距离时,我会执行以下操作:
if ([unit isEqualToString:@"km"]) {
} else {
intTotalKM = intTotalKM / 0.621371192;
}
例如,在不改变我的距离的情况下,当我保存并获取它时,我会损失 1 或 2 公里/英里。
由于 0.621371192 和我只使用 int,我失去了精度。我不想使用双精度值。您对如何处理这个问题有任何想法吗?
编辑:我想知道是否有任何其他转换方式更适合我的情况。
谢谢。
【问题讨论】:
-
您需要存储的最大距离是多少?我们是在谈论地球上的距离,还是您需要更大的距离?
-
您可以考虑将您的距离和单位存储在字典中并保存到
NSUserDefaults。 -
最大距离999999公里。
-
不是你的问题,但更简单的方法是让你在启动时设置的某种全局值是 0.621... 或 1.0。那么你就不需要每次都编写“单元”的测试代码了。
-
每次将乘法或除法的浮点结果转换为 int 时,都会损失大约半公里的精度。您可以通过将内部数字保持为 float/double 并仅在将值存储在 Core Data 中时转换为 int 来将损失减半。但是为什么不想使用浮点数呢?
标签: objective-c nsuserdefaults unit-conversion