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.74detail.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来解决我的问题吗?