我怎么算十进制数?

时间:2014-06-05 22:48:20

标签: ios objective-c double

我必须计算Xcode 5中双精度数中有多少位数。我知道我必须在NSString中转换我的双精度数,但是你能解释一下我怎么能完全做到的?感谢

3 个答案:

答案 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 可能会执行一些'舍入欺骗',因此此方法可能适合您的要求,也可能不适合您的要求。应首先使用您的实现期望确定的近似值范围来测试它是否合适。