【问题标题】:Getting Garbage value while convert into long Objective -C在转换为长目标 -C 时获取垃圾值
【发布时间】:2019-06-27 20:50:11
【问题描述】:

我正在尝试将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(工作正常)

提前致谢。

【问题讨论】:

  • 超出了long的范围
  • 那么会双重解决我的问题吗?

标签: ios objective-c type-conversion nsstring long-integer


【解决方案1】:

这是因为您将 产品 存储到 long 类型变量 t1t2

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

基于C的数据类型:

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

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

【讨论】:

    【解决方案2】:

    9223372036854775807 是 64 位有符号 long 的最大值。我推断[[jsonDict valueForKeyPath:@"detail.amount"]doubleValue] * 1000000000000000000 大于long 的最大值,所以当你将它转换为long 时,你会得到long 可以表示的最接近的值。

    【讨论】:

      【解决方案3】:

      每种数字类型(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
      

      而 Long 64bit 最多只有

      9,223,372,036,854,775,807
      

      所以溢出发生在 9,223,372,036,854,775,808 及以上。这就是您的计算结果。

      还需要注意的是,如果您只满足 64 位长距离的需求,您正在做的事情也会导致问题,因为当您的应用程序在 32 位(如 iPhone 5c 或更低版本)上运行时会发生什么?

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2022-11-18
          • 2019-05-01
          • 1970-01-01
          • 2015-12-10
          • 1970-01-01
          • 1970-01-01
          • 2016-04-29
          • 1970-01-01
          • 2015-08-03
          相关资源
          最近更新 更多