当我将NSNumber
转换为NSDecimalNumber
时,此转换通常不属实。
当我将此值转换为十进制或双精度时,我有一个像92.43这样的数字 [number decimalValue]或[number doubleValue]值更改为92.4299999999 ..
我做了很多事情,比如[NSDecimalNumber decimalNumberWithDecimal:[number decimalValue],它总是返回" 92.429999"到这个数字。
如何使用NSNumber originalValue
十进制或双精度表示我想使用" 92.43"这个数字为" 92.43"。为什么这个价值会改变?
答案 0 :(得分:2)
为什么会这样?
简化的解释是,它与计算机如何执行计算以及如何表示浮点数有关。大多数浮点数只是没有足够准确的表示,因为它们需要表示无限数量的数字,因此舍入(也称为舍入或舍入误差)。
你能做什么?
如果您确实需要执行准确的计算(例如计算价格),则根本不应使用NSNumber
,而是一直使用NSDecimalNumber
并将其用于所有计算。最安全的方法是从字符串创建它,例如:
NSDecimalNumber *decimalNumber = [NSDecimalNumber decimalNumberWithString:@"92.34567891"];
如果准确性无关紧要,您可以将结果格式化为固定的小数位数。在这种情况下,您可能还需要查看NSDecimalNumberHandler
以定义舍入行为。
答案 1 :(得分:-2)
如果您只需要打印此号码,请尝试:
NSLog(@"%.2f", decimalNumber);
这将在两位小数上舍入92.4299999999 ..结果将是:
92.43