将'NSDecimalNumber'转换为'SInt64',而不丢失精度。(在SInt64、iOS范围内)

将'NSDecimalNumber'转换为'SInt64',而不丢失精度。(在SInt64、iOS范围内),ios,precision,numeric,Ios,Precision,Numeric,当前,使用字符串创建的[NSDecimalNumber longLongValue]返回100000000000000 这意味着该类首先将其值转换为double,然后重新转换为SInt64(带符号的long) 如何避免这种行为?我想得到SInt64范围内的精确整数 附言。 我考虑过用NSScanner或strtoll转换成NSString并重新转换成SInt64,但我相信有更好的方法。但是,如果您确定没有其他方法,请告诉我。首先:除非您确定它对性能至关重要,否则我会将其写入字符串并扫描回来。这是

当前,使用字符串创建的
[NSDecimalNumber longLongValue]
返回
100000000000000

这意味着该类首先将其值转换为
double
,然后重新转换为
SInt64
带符号的long

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

附言。
我考虑过用
NSScanner
strtoll
转换成
NSString
并重新转换成
SInt64
,但我相信有更好的方法。但是,如果您确定没有其他方法,请告诉我。

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

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

  • 从您的
    NSDecimalNumber
  • 使用结构的私有字段,从尾数初始化
    long
    值(可能引入检查来处理过大的尾数)
  • 乘以10 ^指数;你可以通过使用;再次检查溢出

  • 从NSDecimalNumber*原始值开始

    设int64_t近似值=[originalValue LongValue]。这并不确切,但非常接近

    将近似值转换为NSDecimalNumber,计算原始值-近似值,取longLongValue,然后加上近似值。现在您得到了正确的结果

    谢谢你的回答#2似乎比1快。然而,#1是您提到的更好的方式:)