我有一个双倍值1318611498349.3559,我想通过执行以下操作将其转换为long,但我得到的值为-4506682935000170496,这对我来说似乎不对。
double dv = ...;
long lv = (double)dv;
...
我在哪里可以找到关于此的文档?
答案 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];