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

时间:2019-02-04 05:36:41

标签: 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: %ld",t2);  

detail.amout = 51.74
detail.fee = 2.72

  

O / P:
  t1:9223372036854775807(在此处获取垃圾值)
  t2:27200000000000000(工作正常)

谢谢。

4 个答案:

答案 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类型变量t1t2中。

使用floatdouble,您将获得正确的答案。

基于C的数据类型:

  

长符号整数类型。至少能够包含   [−2,147,483,647,+2,147,483,647]范围;因此,至少是32   大小。

参考:https://en.wikipedia.org/wiki/C_data_types

答案 2 :(得分:0)

9223372036854775807是64位带符号的long的最大值。我推断出[[jsonDict valueForKeyPath:@"detail.amount"]doubleValue] * 1000000000000000000大于最大long值,因此将其强制转换为long时,会得到long可以代表的最接近的值。

答案 3 :(得分:0)

如您所读,long是不可能的。由于看起来您确实在进行数学运算,因此应该使用NSDecimalNumber而不是double来解决该问题。