如何将double转换为NSInteger?

6

这里有一个非常简单的问题。我有一个double类型的变量,我想将其转换为NSInteger类型,并截断到个位数。应该如何操作?


1
你为什么想要一个 NSInteger 而不是 NSNumber?另外,你想要四舍五入还是直接截断? - Jesse Naugher
现在我想想,让它向上取整会很好。 - sudo rm -rf
5个回答

15

截断是一种隐式转换:

NSInteger theInteger = theDouble;

假设您未检查数值是否在NSInteger的范围内。如果要这样做,您需要添加一些分支:

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

正是我所需要的,谢谢。额外的好处是检查范围,但对于我的使用,我不必担心这个问题。再次感谢! - sudo rm -rf
3
您在评论中提到了四舍五入。使用ceil(theDouble)可以向上取整,使用floor(theDouble)可以向下取整。请记住,对于负数而言,向上取整是指朝着零的方向取整,向下取整是指朝着负无穷大的方向取整。 - Jonathan Grynspan
+1:啊,我写了一个简单的四舍五入函数...忘记了对于双精度浮点数使用 ceil 和 floor。更好和精确的答案。 - Jesse Naugher
感谢您提供四舍五入的答案。 - sudo rm -rf

5

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

double originalNumber;
NSInteger integerNumber = (NSInteger)originalNumber;

根据C语言规范,这将截断originalNumber。

看起来你们同时得到了相同的答案。 :) - sudo rm -rf
1
是的,但乔纳森涵盖了范围,所以绝对值得打勾。 - Tommy

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的需求可以通过简单的截断来满足,但为了完全泛化的精神,值得记住在调用floor()之前将double加0.5以实现四舍五入的简单技巧。扩展Jonathan Grynspan的评论:NSInteger myInt = floor(myDouble + 0.5);即,在绝对意义上向上取整。如果“向上”取整意味着远离零的四舍五入,则需要更复杂的方法:NSInteger myInt = floor( myDouble + (myDouble < 0.0 ? -0.5 : 0.5) );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接