目标C - 如何将double转换为long

时间:2011-10-14 17:04:09

标签: objective-c double long-integer

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

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

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

6 个答案:

答案 0 :(得分:5)

其他答案是正确的,因为double可以保存比任何整数类型大得多的值,但是如果double值在范围内,那么能够进行转换会很好。

编译器没有试图将双重转换为long的原因是因为你实际上可以做到这一点。显然,计算机中的所有内容都存储为1和0的字符串,基本上你的代码所做的就是说取vIn并将这些位解释为长整数值。获取浮点值的位并将它们解释为整数类型很少有用,并且值不在double所代表的位置附近。

我其实是在尝试做相反的事情。我需要将长(实际上很长)转换为双倍。然后它击中了我,让NSNumber进行转换。使用您想要的值创建一个临时NSNumber对象,然后使用该方法获取您想要的值类型。

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

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

答案 1 :(得分:2)

这是错误的,因为它在8个字节上表示为double,而在4个字节上表示为long,因此双数字太大。

答案 2 :(得分:0)

LONG_MAX为0x7FFFFFFFL或2147483647。

即:

2147483647

总是少于:

1318611498349.3559

我很惊讶编译器没有发现转换错误/某种警告,因为无论你做什么,64磅的钻头都不适合用在32磅的袋子里。

答案 3 :(得分:0)

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

应该是转换的方式。

答案 4 :(得分:0)

双精度数可以表示比长数字高得多的数字,因为它由多个有效数字表示,并且用指数设定其数量。

结果是值的范围比长期可以处理的要大得多。

此处提供更多信息:

http://en.wikipedia.org/wiki/Floating_point

如果使用具有相同位数的浮点类型作为整数类型并不重要 - 这不是问题的真正原因 - 浮点数被设计为代表更大的事实范围。

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

答案 5 :(得分:0)

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

NSDate * now = [NSDate date] ; NSNumber * seconds_since_epoch = [[NSNumber numberWithDouble:[now timeIntervalSince1970]] longValue];