Objective c 目标C-如何将双精度转换为长精度

Objective c 目标C-如何将双精度转换为长精度,objective-c,double,long-integer,Objective C,Double,Long Integer,我有一个双精度值1318611498349.3559,我想通过执行以下操作将其转换为long,但得到的值是-4506682935000170496,这对我来说似乎是错误的 double dv = ...; long lv = (double)dv; ... 我在哪里可以找到有关此的文档?这是错误的,因为它在8字节上表示为双精度,在4字节上表示为long,所以双精度数字太大。long\u MAX是0x7FFFFFFFL或2147483647 即: 这比: 1318611498349.3559

我有一个双精度值1318611498349.3559,我想通过执行以下操作将其转换为long,但得到的值是-4506682935000170496,这对我来说似乎是错误的

double dv = ...;
long lv = (double)dv;
...

我在哪里可以找到有关此的文档?

这是错误的,因为它在8字节上表示为双精度,在4字节上表示为long,所以双精度数字太大。

long\u MAX是0x7FFFFFFFL或2147483647

即:

这比:

1318611498349.3559
我很惊讶编译器没有发出某种类型的转换错误/警告,因为无论你做什么,64磅的比特都不适合32磅的袋子

double vIn = 0.0;
long vOut = (long)vIn;

应该是转换的方式。

双精度可以表示比长精度高得多的数量,因为它由许多有效数字和一个指数来表示,以设置其数量

结果是,值的范围远远大于long可以处理的范围

更多信息请点击此处:

如果您使用的浮点类型的位数与整数类型的位数相同,这无关紧要——这不是问题的真正原因——事实上,浮点是为了表示更大的范围而设计的


例如,最大4字节浮点数不能表示为8字节整数类型。

其他答案是正确的,因为双精度可以保存比任何整数类型大得多的值,但是如果双精度值在范围内,则最好能够进行转换

编译器没有因为您试图将一个double转换为long而对您发牢骚的原因是因为您实际上可以这样做。显然,计算机中的所有内容都存储为1和0的字符串,基本上,您的代码所做的就是说获取vIn并将位解释为长整数值。接受浮点值的位并将其解释为整数类型很少有用,而且该值与double表示的值相差甚远

事实上,我正试图做相反的事情。我需要将long(实际上是long-long)转换为double。然后它击中了我,让NSNumber做转换。创建一个具有所需值的临时NSNumber对象,然后使用该方法获取所需值的类型

double vIn = 123.4321;
long vOut = [[NSNumber numberWithDouble:vIn] longValue];

不保证这会满足你的要求。我猜如果double值大于long可以存储的值,它将返回最大值。

我使用它来存储自epoch以来的秒数。这需要转换,因为timeIntervalSince1970返回一个双精度值。在我的情况下,溢出不会发生(至少在不久的将来),但您可以添加一个超过LONG_MAX的测试

NSDate*now=[NSDate-date];

NSNumber*seconds_-since_epoch=[[NSNumber numberWithDouble:[now timeintervalencesince1970]]longValue]

这相当于OP的代码(对于示例输入不起作用)。请提供更多代码,包括初始化和打印值的方式。另外,你在为什么建筑而建?
double vIn = 123.4321;
long vOut = [[NSNumber numberWithDouble:vIn] longValue];