我必须计算Xcode 5中双精度数中有多少位数。我知道我必须在NSString中转换我的双精度数,但是你能解释一下我怎么能完全做到的?感谢
答案 0 :(得分:0)
一个好的方法可能是取你的双值,并且,对于每次迭代,递增一个计数器,将你的值乘以十,并不断检查左小数部分是否真的接近于零。
这可能是一个解决方案(参考Graham Perks先前的代码):
int countDigits(double num) {
int rv = 0;
const double insignificantDigit = 8;
double intpart, fracpart;
fracpart = modf(num, &intpart);
while ((fabs(fracpart) > 0.000000001f) && (rv < insignificantDigit))
{
num *= 10;
fracpart = modf(num, &intpart);
rv++;
}
return rv;
}
答案 1 :(得分:0)
一个重要的问题是,double有一个没有定义长度的小数部分。如果你知道你想要,比方说3个小数位,你可以这样做:
[[NSString stringWithFormat:@"%1.3f", theDoubleNumber] length]
有更优雅的方法,使用模运算或对数,但你想要多么优雅?
答案 2 :(得分:0)
您可以将 double 包装在 NSNumber 的实例中,并从 NSNumber 实例中获取 NSString 表示。从那里,计算小数点后的位数。
一种可能的方法是实现一个方法,该方法将double作为参数并返回一个表示小数位数的整数 -
- (NSUInteger)decimalPlacesForDouble:(double)number {
// wrap double value in an instance of NSNumber
NSNumber *num = [NSNumber numberWithDouble:number];
// next make it a string
NSString *resultString = [num stringValue];
NSLog(@"result string is %@",resultString);
// scan to find how many chars we're not interested in
NSScanner *theScanner = [NSScanner scannerWithString:resultString];
NSString *decimalPoint = @".";
NSString *unwanted = nil;
[theScanner scanUpToString:decimalPoint intoString:&unwanted];
NSLog(@"unwanted is %@", unwanted);
// the number of decimals will be string length - unwanted length - 1
NSUInteger numDecimalPlaces = (([resultString length] - [unwanted length]) > 0) ? [resultString length] - [unwanted length] - 1 : 0;
return numDecimalPlaces;
}
使用类似的代码测试方法 -
// test by changing double value here...
double testDouble = 1876.9999999999;
NSLog(@"number of decimals is %lu", (unsigned long)[self decimalPlacesForDouble:testDouble]);
结果 -
结果字符串是1876.9999999999
不需要的是1876年
小数位数是10
根据双重的值, NSNumber 可能会执行一些'舍入欺骗',因此此方法可能适合您的要求,也可能不适合您的要求。应首先使用您的实现期望确定的近似值范围来测试它是否合适。