2011-01-12 159 views
6

这里很简单的问题。我有一个双我希望转换回NSInteger,截断到单位的地方。我会怎么做?如何将一个double转换为NSInteger?

+1

你想要NSInteger而不是NSNumber的任何原因?你也想四舍五入吗? – 2011-01-12 16:44:29

+0

现在我想起来了,把它凑到一起很好。 – 2011-01-12 16:46:49

回答

14

截断是隐式转换:

NSInteger theInteger = theDouble; 

这是假设你没有检查值NSInteger的的范围内。如果你想做到这一点,你必须添加一些分支:

NSInteger theInteger = 0; 
if (theDouble > NSIntegerMax) { 
    // ... 
} else if (theDouble < NSIntegerMin) { 
    // ... 
} else { 
    theInteger = theDouble; 
} 
+0

正是我在找什么,谢谢。增加了检查范围的好处,除非我不用担心这一点。再次感谢! – 2011-01-12 16:48:50

4

NSInteger的是一个C类型的类型定义。所以你可以这样做:

double originalNumber; 
NSInteger integerNumber = (NSInteger)originalNumber; 

其中,根据C规范,将截断originalNumber。

1

但无论如何,假设你要没有四舍五入,我相信这应该只是

double myDouble = 10.4223; 
NSInteger myInt = myDouble; 

编辑四舍五入:(我敢肯定,那里有一个更简单的(和准确)的方式来做到这一点。(这还没有考虑负数或最大边界)

double myDecimal = myDouble - myInt; 
if(myDecimal < 0.50) 
{ 
//do nothing 
} 
else 
{ 
myInt = myInt + 1; 
} 
1

NSInteger的是一个typedef,它就像使用一个int只是分配像值:

double d;
NSInteger i = d;

0

JesseNaugher提到四舍五入,我注意到OP需求被一个简单的truncate满足,但是本着完全泛化的精神,值得记住在调用floor()以实现舍入之前向double添加0.5的简单技巧。扩展乔纳森Grynspan的评论:NSInteger myInt = floor(myDouble + 0.5);即,在绝对条款四舍五入。如果取整意味着四舍五入,则需要更复杂的方法:NSInteger myInt = floor(myDouble + (myDouble < 0.0 ? -0.5 : 0.5));