获取垃圾的价值,同时转换为长期目标-C

问题描述 投票:0回答:4

我想转换NSStringlong,但我得到的垃圾值。下面是我的代码:

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亿(工作正常)

提前致谢。

ios objective-c type-conversion nsstring long-integer
4个回答
1
投票

每个号码类型(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 =千兆)的数量。等等


0
投票

这是因为要存储的产品long类型变量t1t2

二者必选其一floatdouble,你会得到正确的答案。

基于C的数据类型:

龙符号整型。能够至少含有[-2,147,483,647,2147483647]的范围;因此,它是在大小为至少32位。

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


0
投票

9223372036854775807是一个64位带符号的long的最大值。我推断,[[jsonDict valueForKeyPath:@"detail.amount"]doubleValue] * 1000000000000000000比最大long值较大,所以当你施放它long,你会得到long可以代表最接近的值。


0
投票

当你阅读,这是不可能的long。因为它看起来像你这样做融资数学,你应该使用NSDecimalNumber double来解决这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.