在我的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 ,所以我的精确度会下降。我不想使用双值。您对如何处理这个问题有任何想法吗?
编辑:我想知道是否还有其他转换方式更适合我的情况。
感谢。
答案 0 :(得分:3)
唯一没有损失的解决方案是以原始单位存储距离。添加一个单字符列,指定表达距离的单位,并存储代码(例如'K'
km
和'M'
英里数)以及实际距离。< / p>
如果添加列不是一个选项,您可以将单位放在您存储的数字的高位:由于您应用中的最大距离是2^20
,您可以使用其余的12位用于编码表示距离的单位的编号。使用dist & 0xFFFFF
提取实际距离,使用dist >> 20
提取单位代码(1
为km
,0
为mi
。< / 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和不准确的值......