将 NSString 转换为 NSNumber 精度问题
Posted
技术标签:
【中文标题】将 NSString 转换为 NSNumber 精度问题【英文标题】:Convert NSString to NSNumber precision issue 【发布时间】:2015-01-07 05:43:24 【问题描述】:我有一个小数点后 7 位的字符串:@"-28.1234212"
我想将其转换为NSNumber
而不会丢失任何精度。当我执行以下操作时,我只得到 4 位小数。
NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
NSNumber* convertedNum = [f numberFromString:@"-28.1234212"];
现在convertNum 是-28.1234
而不是-28.1234212
。
是否有可能做到这一点而不会丢失精度?
【问题讨论】:
你确定底层数字实际上已经失去了精度(而不是 NSNumber 只是打印到小数点后 4 位)? 我正在打印和检查调试。 请贴出您用来打印的代码。 NSLog(@"%@", convertNum); 另外你不需要使用NSNumberFormatter
。这应该可以代替:NSNumber *convertedNum = [NSNumber numberWithDouble:@"-28.1234212".doubleValue]
【参考方案1】:
更改数字格式器样式
[f setNumberStyle:kCFNumberFormatterNoStyle];
使用 kCFNumberFormatterNoStyle 样式
NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:kCFNumberFormatterNoStyle];
NSNumber* convertedNum = [f numberFromString:@"-28.1234212"];
NSLog(@"%@",convertedNum);
【讨论】:
【参考方案2】:如果您正在寻找精度,您可以使用 NSDecimalNumber。
NSDecimalNumber *convertedNUm = [NSDecimalNumber decimalNumberWithString:@"-28.1234212"]
【讨论】:
【参考方案3】:NSString *nowValue =@"-28.1234212";
NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:kCFNumberFormatterNoStyle];
NSNumber * nowNum = [f numberFromString:nowValue];
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setMaximumFractionDigits:4]; //set max fraction digit
NSNumber *nowValueFormatted = [formatter stringFromNumber:nowNum];
NSLog(@"%@",nowNum);
NSLog(@"%@",nowValueFormatted);
这可能对你有帮助:)
【讨论】:
【参考方案4】:为什么需要格式化程序?可以直接转成NSNumber
NSString *douStr = @"-28.1234212";
NSNumber *num = [NSNumber numberWithDouble:douStr.doubleValue];
【讨论】:
以上是关于将 NSString 转换为 NSNumber 精度问题的主要内容,如果未能解决你的问题,请参考以下文章
将 NSString 转换为 NSNumber 会导致数字过多和奇怪的舍入
将 NSString 转换为特定于语言环境的 NSNumber
在 CoreData 实体中将属性从 NSNumber 转换为 NSString - LightWeightMigration