1

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

这意味着该类将其值转换为doublefirst,然后重新转换为SInt64( signed long long)

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

PS。我考虑过转换为NSString并重新转换为SInt64with NSScanneror strtoll,但我相信有更好的方法。但如果你确定没有其他办法,请告诉我。

4

2 回答 2

0

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

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

  1. NSDecimal从你那里得到一个NSDecimalNumber
  2. 使用结构的私有字段,long long从尾数初始化您的值(可能引入检查以处理太大的尾数)
  3. 乘以 10^指数;您可以使用二进制求幂来做到这一点;再次检查溢出
于 2010-11-06T19:53:56.030 回答
0

从 NSDecimalNumber* originalValue 开始。

让 int64_t 约 = [originalValue longLongValue]。这将不准确,但非常接近。

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

于 2015-10-14T19:34:09.307 回答