NSNumber到NSDecimalNumber转换问题

时间:2015-06-23 20:30:05

标签: ios objective-c rounding nsnumber nsdecimalnumber

当我将NSNumber转换为NSDecimalNumber时,此转换通常不属实。

当我将此值转换为十进制或双精度时,我有一个像92.43这样的数字 [number decimalValue]或[number doubleValue]值更改为92.4299999999 ..

我做了很多事情,比如[NSDecimalNumber decimalNumberWithDecimal:[number decimalValue],它总是返回" 92.429999"到这个数字。

如何使用NSNumber originalValue十进制或双精度表示我想使用" 92.43"这个数字为" 92.43"。为什么这个价值会改变?

2 个答案:

答案 0 :(得分:2)

为什么会这样?

简化的解释是,它与计算机如何执行计算以及如何表示浮点数有关。大多数浮点数只是没有足够准确的表示,因为它们需要表示无限数量的数字,因此舍入(也称为舍入或舍入误差)。

你能做什么?

如果您确实需要执行准确的计算(例如计算价格),则根本不应使用NSNumber,而是一直使用NSDecimalNumber并将其用于所有计算。最安全的方法是从字符串创建它,例如:

NSDecimalNumber *decimalNumber = [NSDecimalNumber decimalNumberWithString:@"92.34567891"];

如果准确性无关紧要,您可以将结果格式化为固定的小数位数。在这种情况下,您可能还需要查看NSDecimalNumberHandler以定义舍入行为。

答案 1 :(得分:-2)

如果您只需要打印此号码,请尝试:

NSLog(@"%.2f", decimalNumber);

这将在两位小数上舍入92.4299999999 ..结果将是:

  

92.43

相关问题