1

在这里,我使用NSNumberFormater将最大小数位数设置为双精度为 2。它似乎工作正常,但是当我尝试从 生成的字符串将其转换回双精度时NSNumberFormater,正如您在NSLog输出中看到的那样,任何小数都被删除并替换为尾随零。为什么是这样?

- (double)randomDoubleBetween:(double)smallNumber and:(double)bigNumber {
    double diff = bigNumber - smallNumber;
    double ranNum = (((double) (arc4random() % ((unsigned)RAND_MAX + 1)) / RAND_MAX) * diff) + smallNumber;

    NSNumberFormatter *doubleValueWithMaxDecimalDigits = [[NSNumberFormatter alloc] init];
    [doubleValueWithMaxDecimalDigits setNumberStyle:NSNumberFormatterDecimalStyle];
    [doubleValueWithMaxDecimalDigits setMaximumFractionDigits:2];
    NSNumber *num = [NSNumber numberWithDouble:ranNum];

    NSString *valueToReturn = [doubleValueWithMaxDecimalDigits stringFromNumber:num];
    NSLog(@"String value %@", valueToReturn);

    NSLog(@"Double value converted from string %f", [valueToReturn doubleValue]);
    return [valueToReturn doubleValue];
}

NSLog 输出:

2013-08-09 02:25:05.031 GG[27947:907] 字符串值 176,19

2013-08-09 02:25:05.035 GG[27947:907] 从字符串 176.000000 转换的双精度值

4

1 回答 1

4

看起来-[NSString doubleValue]不尊重语言环境小数点分隔符;它需要一个点,而不是逗号。

// US uses point as decimal separator
[doubleValueWithMaxDecimalDigits setLocale:[[NSLocale alloc]initWithLocaleIdentifier:@"en_US"]];

NSString *valueToReturn = [doubleValueWithMaxDecimalDigits stringFromNumber:num];

// Correctly includes fractional part
NSLog(@"Double value converted from string %lf", [valueToReturn doubleValue]);

// Italy uses a comma
[doubleValueWithMaxDecimalDigits setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"it_IT"]];
valueToReturn = [doubleValueWithMaxDecimalDigits stringFromNumber:num];

// Drops fractional part
NSLog(@"Double value converted from string %lf", [valueToReturn doubleValue]);

我不确定您为什么要将数字格式化为您不使用的字符串,但如果您要继续这样做,请再次使用相同的格式化程序将字符串解析为 adouble在返回之前。

(此外,您的格式说明符错误;使用%lffor double。)

于 2013-08-09T00:37:34.327 回答