我想转换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:272000000亿(工作正常)
提前致谢。
每个号码类型(int,长,双,浮动)具有限制。为了您的长度为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 5℃以下的)什么?
一般一个坏主意,用大量的,除非你做复杂的数学。如果数字准确度并不重要,那么你应该考虑简化像51,740G(G =千兆)的数量。等等
这是因为要存储的产品long
类型变量t1
和t2
。
二者必选其一float
或double
,你会得到正确的答案。
基于C的数据类型:
龙符号整型。能够至少含有[-2,147,483,647,2147483647]的范围;因此,它是在大小为至少32位。
9223372036854775807是一个64位带符号的long
的最大值。我推断,[[jsonDict valueForKeyPath:@"detail.amount"]doubleValue] * 1000000000000000000
比最大long
值较大,所以当你施放它long
,你会得到long
可以代表最接近的值。
当你阅读,这是不可能的long
。因为它看起来像你这样做融资数学,你应该使用NSDecimalNumber
double
来解决这个问题。