首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何判断一个数字是正数还是负数?

如何判断一个数字是正数还是负数?
EN

Stack Overflow用户
提问于 2010-10-22 14:48:27
回答 29查看 102.8K关注 0票数 57

在一次采访中,我被问到如何确定一个数字是正数还是负数。规则是,我们不应该使用关系运算符,如<>,内置在java函数(如substringindexOfcharAtstartsWith),没有正则表达式,或API。

我在这方面做了一些功课,代码如下,但它只适用于整数类型。但他们要求我编写一个适用于floatdoublelong的通用代码。

代码语言:javascript
复制
 // This might not be better way!!

 S.O.P ((( number >> 31 ) & 1) == 1 ? "- ve number " : "+ve number );

你有什么想法吗?

EN

回答 29

Stack Overflow用户

回答已采纳

发布于 2010-10-22 21:10:09

整数的情况很简单。双重情形要复杂得多,直到你还记得无穷大。

注意:如果你认为双常量是“应用程序接口的一部分”,你可以用1E308 * 2这样的溢出表达式来替换它们。

代码语言:javascript
复制
int sign(int i) {
    if (i == 0) return 0;
    if (i >> 31 != 0) return -1;
    return +1;
}
int sign(long i) {
    if (i == 0) return 0;
    if (i >> 63 != 0) return -1;
    return +1;
}
int sign(double f) {
    if (f != f) throw new IllegalArgumentException("NaN");
    if (f == 0) return 0;
    f *= Double.POSITIVE_INFINITY;
    if (f == Double.POSITIVE_INFINITY) return +1;
    if (f == Double.NEGATIVE_INFINITY) return -1;

    //this should never be reached, but I've been wrong before...
    throw new IllegalArgumentException("Unfathomed double");
}
票数 68
EN

Stack Overflow用户

发布于 2010-10-22 15:14:16

下面是一个可怕的方法,它会让你在任何工作中被解雇。

这取决于你得到一个Stack Overflow异常,或者Java对它的任何调用...它只适用于那些不会疯狂地偏离0的正数。

负数很好,因为您会溢出到正数,然后最终会得到一个堆栈溢出异常,它将返回false,或者“是,它是负的”。

代码语言:javascript
复制
Boolean isPositive<T>(T a)
{
  if(a == 0) return true;
  else
  {
    try
    {
      return isPositive(a-1);
    }catch(StackOverflowException e)
    {
      return false; //It went way down there and eventually went kaboom
    }
  }
}
票数 36
EN

Stack Overflow用户

发布于 2010-10-22 15:57:35

这将只适用于除0..2之外的所有对象。

代码语言:javascript
复制
boolean isPositive = (n % (n - 1)) * n == n;

你可以像这样做一个更好的解决方案(0..1除外)

代码语言:javascript
复制
boolean isPositive = ((n % (n - 0.5)) * n) / 0.5 == n;

可以通过将0.5部分更改为类似2^m (m整数)的形式来获得更高的精度:

代码语言:javascript
复制
boolean isPositive = ((n % (n - 0.03125)) * n) / 0.03125 == n;
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3994531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档