目标-c英里/公里转换

时间:2012-11-24 14:00:35

标签: objective-c nsuserdefaults unit-conversion

在我的iPhone应用程序中,用户可以更改首选项中的单位(公里或英里)。

[[NSUserDefaults standardUserDefaults] setObject:@"km" forKey:@"distanceUnit"];

[[NSUserDefaults standardUserDefaults] setObject:@"mile" forKey:@"distanceUnit"];

我在核心数据中仅以km为单位保存距离。我使用 int 。因此,每当我到达距离时,我都会执行以下操作:

if ([unit isEqualToString:@"km"]) {
} else {
    intTotalKM = intTotalKM * 0.621371192;
} 

在保存距离时,我会执行以下操作:

if ([unit isEqualToString:@"km"]) {
} else {
    intTotalKM = intTotalKM / 0.621371192;
}

例如,在不改变距离的情况下,当我保存并获得它时,我会松开1或2公里/英里。

由于 0.621371192 ,因为我只使用 int ,所以我的精确度会下降。我不想使用双值。您对如何处理这个问题有任何想法吗?

编辑:我想知道是否还有其他转换方式更适合我的情况。

感谢。

4 个答案:

答案 0 :(得分:3)

唯一没有损失的解决方案是以原始单位存储距离。添加一个单字符列,指定表达距离的单位,并存储代码(例如'K' km'M'英里数)以及实际距离。< / p>

如果添加列不是一个选项,您可以将单位放在您存储的数字的高位:由于您应用中的最大距离是2^20,您可以使用其余的12位用于编码表示距离的单位的编号。使用dist & 0xFFFFF提取实际距离,使用dist >> 20提取单位代码(1km0mi。< / p>

答案 1 :(得分:2)

如果你真的希望保持整数并保持精确使用较小的单位。您的最大需求为999999km,如果您的整数为32位,则可以以米为单位存储该值并调整转换以生成码。如果你的整数是64位,那么你可以使用cm甚至mm,但你可能不需要那么远。这是一些财务计算的完成方式,例如: $ 1.59不会存储为1.59,而是存储为159。

答案 2 :(得分:2)

如果通过转换数字一次而导致的精度损失是可以接受的,那么我每次显示/保存时都会来回转换,只转换,如果当用户输入值时需要。

换句话说,就像你的用户默认值一样,内存中的值只表示km。

- (void)textFieldDidEndEditing:(UITextField *)textField {
    intTotalKM = [textField.text intValue];

    if ([unit isEqualToString:@"mile"]) {
        intTotalKM = intTotalKM / 0.621371192;
    }
}

请注意,当用户输入新值时,此转化仅执行一次

要向用户显示值,您可以根据需要将值转换为英里。保存值时,只需保存intTotalKM而不进行任何转换,因为它始终存储在KM中。

否则,您应该以不会导致精度损失的方式存储值。通过存储数字的小数部分(使用双倍),通过保存为不同的单位(如米 - 我个人最喜欢的)或存储单位和使用原生值,所有这些都在此处的其他答案中建议。

答案 3 :(得分:1)

你自己回答了这个问题:因为你使用整数而失去了精确度......你没有多少选择。要么改为double,要么坚持使用int和不准确的值......