在没有精度损失的情况下将`NSDecimalNumber`转换为`SInt64`。 (在SInt64,iOS范围内)

时间:2010-11-03 01:43:56

标签: ios precision numeric

目前,使用字符串[NSDecimalNumber longLongValue]创建的@"9999999999999999"会返回10000000000000000

这意味着该类首先将其值转换为double,然后重新转换为SInt64signed long long

如何规避这种行为?我希望得到SInt64范围内的精确整数。

PS。 我考虑转换为NSString并使用SInt64NSScanner重新转换为strtoll,但我相信还有更好的方法。但如果你确定没有别的办法,请告诉我。

2 个答案:

答案 0 :(得分:0)

首先:除非您确定它的性能至关重要,否则我会将其写入字符串并将其扫描回来。这是简单的方法。

现在,如果你真的想这样做,那么:

  1. NSDecimal
  2. 获取NSDecimalNumber
  3. 使用结构的私有字段,从尾数初始化long long值(可能会引入检查以处理过大的尾数)
  4. 乘以10 ^指数;你可以使用binary exponentiation来做到这一点;再次检查溢出

答案 1 :(得分:0)

从NSDecimalNumber * originalValue开始。

让int64_t约= [originalValue longLongValue]。这不是确切的,但非常接近。

将大约转换为NSDecimalNumber,计算originalValue - approx,取longLongValue,并添加到约。现在你得到了正确的结果。