我正在尝试将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:27200000000000000(工作正常)
谢谢。
答案 0 :(得分:1)
每种数字类型(int,long,double,float)都有限制。对于您的长64位(因为您的设备为64位),上限为:9,223,372,036,854,775,807(请参见此处:https://en.wikipedia.org/wiki/9,223,372,036,854,775,807)
您的情况是51.74 * 1,000,000,000,000,000,000 =
51,740,000,000,000,000,000
64位的最大长度为
9,223,372,036,854,775,807
因此,溢出发生在9,223,372,036,854,775,808及以上。您的计算结果是哪个。
还要注意的是,如果仅满足64位远程要求,您所做的事情也会引起问题,因为当您的应用程序在32位(例如iPhone 5c或更低版本)上运行时会发生什么?
除非要进行复杂的数学运算,否则通常不建议使用大数。如果数字精度不是很关键,则应考虑简化数字,例如51,740G(G = Giga)。等
答案 1 :(得分:0)
这是因为您要将产品存储到long
类型变量t1
和t2
中。
使用float
或double
,您将获得正确的答案。
基于C的数据类型:
长符号整数类型。至少能够包含 [−2,147,483,647,+2,147,483,647]范围;因此,至少是32 大小。
答案 2 :(得分:0)
9223372036854775807是64位带符号的long
的最大值。我推断出[[jsonDict valueForKeyPath:@"detail.amount"]doubleValue] * 1000000000000000000
大于最大long
值,因此将其强制转换为long
时,会得到long
可以代表的最接近的值。
答案 3 :(得分:0)
如您所读,long
是不可能的。由于看起来您确实在进行数学运算,因此应该使用NSDecimalNumber
而不是double
来解决该问题。