我有一个值存储为NSDecimalNumber,当我将其转换为双精度值时,它将失去精度。

对于我正在调试的当前数据,该值为0.2676655。当我向其发送doubleValue消息时,得到0.267665。它被截断而不是四舍五入,这对一些使用哈希检测同步操作的数据更改的代码造成了严重破坏。

NSDecimalNumber实例来自第三方框架,因此我不能仅将其替换为原始double。最终,它被插入到NSMutableString中,所以我要使用字符串表示形式,但是它需要通过格式说明符“%.6lf”传递,基本上我需要在小数点后六位,因此它看起来像0.267666。

如何在不损失精度的情况下完成此任务?如果有一种格式化NSDecimalNumber的好方法,而又不转换为可以正常工作的double的话。

最佳答案

NSDecimalNumber实例来自第三方框架,所以我
  不能只用原始double替换它。


是的你可以。 NSDecimalNumber是NSNumber的一个不变的子类,在转换时,它有点有用:

double myDub = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithDouble:((double)0.2676655)] doubleValue]];



  最终,它被插入到NSMutableString中,所以我
  字符串表示形式,但是需要通过一种格式进行传递
  “%.6lf”的说明符,基本上我需要小数点后六位,所以
  它看起来像0.267666。


不幸的是,双精度不能四舍五入,但是得到一个百万分之一的字符串值并不是一件大事(我希望):

NSDecimalNumber *num = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithDouble:((double)0.2676655)] decimalValue]];
NSString *numString = [NSString stringWithFormat:@"%.6lf", [num doubleValue]];
NSLog(@"%@",numString);

关于objective-c - 如何将NSDecimalNumber转换为double,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11548615/

10-14 10:55