Ios 转换为长目标时获取垃圾值-C

Ios 转换为长目标时获取垃圾值-C,ios,objective-c,type-conversion,nsstring,long-integer,Ios,Objective C,Type Conversion,Nsstring,Long Integer,我试图将NSString转换为long,但我得到了垃圾值。下面是我的代码: long t1 = [[jsonDict valueForKeyPath:@"detail.amount"]doubleValue] * 1000000000000000000; long t2 = [[jsonDict valueForKeyPath:@"detail.fee"]doubleValue] * 10000000000000000; NSLog(@"t1: %ld",t1); NSLog(@"t2: %

我试图将
NSString
转换为
long
,但我得到了垃圾值。下面是我的代码:

long t1 = [[jsonDict valueForKeyPath:@"detail.amount"]doubleValue] * 1000000000000000000;
long t2 = [[jsonDict valueForKeyPath:@"detail.fee"]doubleValue] * 10000000000000000;  
NSLog(@"t1: %ld",t1);
NSLog(@"t2: %ld",t2);  
detail.amout=51.74
detail.fee=2.72

O/p:
t1:9223372036854775807(在此处获取垃圾值)
t2:27200000000000(工作罚款)


提前感谢。

这是因为您正在将产品存储到
long
类型变量
t1
t2

使用
float
double
,您将得到正确答案

基于C的数据类型:

长符号整数类型。至少能够包含 [−2147483647,+2147483647]范围;因此,它至少是32 大小不一


Ref:

9223372036854775807是64位有符号
的最大值。我推断,
[[jsonDict valueForKeyPath:@“detail.amount”]doubleValue]*10000000000000000
大于最大的
long
值,因此当您将其转换为
long
时,您会得到
long
可以表示的最接近的值。

每种数字类型(int、long、double、float)都有限制。对于长64位(因为您的设备是64位)数字,上限为:9223372036854775807(请参见此处:)

在你的情况下,51.74*10000000000000000=

51,740,000,000,000,000,000
而Long64位的最大值为

9,223,372,036,854,775,807
因此,溢出发生在9223372036854775808及以上。这就是你的计算结果

还需要注意的是,如果你只适合64位的长距离,你所做的也会引起问题,因为当你的应用程序运行在32位(如iPhone 5c或更低)上时会发生什么


除非你在做复杂的数学,否则使用大数字通常是个坏主意。如果数字精度不重要,那么你应该考虑简化51740G(G=Giga)的数目。等等。

正如您所阅读的,使用
long
是不可能的。因为看起来你是做金融数学的,所以你应该用
NSDecimalNumber
而不是
double
来解决这个问题。

它超出了长度范围,所以你会用double来解决我的问题吗?