将 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 会导致数字过多和奇怪的舍入

将核心数据中的 NSNumber 转换为 NSString

将 NSString 转换为特定于语言环境的 NSNumber

在 CoreData 实体中将属性从 NSNumber 转换为 NSString - LightWeightMigration

React Native - nsnumber类型的json值'0'无法转换为nsstring