如何测试double是否为零?

时间:2013-08-15 19:28:01

标签: java

我有一些像这样的代码:

class Foo {
    public double x;
}

void test() {
    Foo foo = new Foo();

    // Is this a valid way to test for zero? 'x' hasn't been set to anything yet.
    if (foo.x == 0) {

    }

    foo.x = 0.0;

    // Will the same test be valid?
    if (foo.x == 0) {

    }
}

我基本上希望将来避免被零除的例外。

由于

6 个答案:

答案 0 :(得分:44)

未明确初始化时,类范围中的数字基元初始化为零。

必须显式初始化本地范围内的数字基元(方法中的变量)。

如果您只担心除零除外,请检查您的双精度 零是否正常。

if(value != 0)
    //divide by value is safe when value is not exactly zero.

否则在检查浮点值(如doublefloat)是否为0时,使用错误阈值来检测值是否接近0,但不是< strong>相当 0。

public boolean isZero(double value, double threshold){
    return value >= -threshold && value <= threshold;
}

答案 1 :(得分:8)

是;所有原始数字类型都默认为0

但是,涉及浮点类型(doublefloat)的计算可能不准确,因此通常最好检查它是否关闭0

if (Math.abs(foo.x) < 2 * Double.MIN_VALUE)

你需要pick a margin of error,这不简单。

答案 2 :(得分:4)

在Java中,0与0.0相同,并且默认为0(尽管许多人建议始终明确设置它们以提高可读性)。 我已经检查过,如果foo.x == 0为零,则foo.x == 0.0foo.x都为真

答案 3 :(得分:1)

是的,这是一个有效的测试,尽管有从int到double的隐式转换。为了清晰/简单,您应该使用(foo.x == 0.0)进行测试。这将阻止NAN错误/除零,但在某些情况下,double值可能非常非常接近0,但不完全为零,然后测试将失败(我现在一般都在谈论,而不是你的代码)。由此划分将给出巨大的数字。

如果这与金钱有关,请不要使用float或double,而是使用BigDecimal。

答案 4 :(得分:0)

当我们在Java double float 上进行比较或循环时,可能会出现使用 == 进行无限循环的问题>

示例:

DEBUG:

这会导致无限循环!

如果需要比较double或float值,请始终使用近似值:

示例:

const Nightmare = require('nightmare');
const nightmare = Nightmare({ show: true});


nightmare
  .goto('path')
  .type('input[name="username"]', 'username')
  .type('input[name="password"]', 'password')
  .click('input[type="submit"][value = "OK"]')
  .wait(5000)
  .evaluate(() => document.querySelector('body').innerText)
  .end()
  .then(console.log)
  .catch(error => {
    console.error('Search failed:', error)
  });

答案 5 :(得分:-4)

最安全的方法是将你的双重按0或0。 看看这个XORing two doubles in Java

基本上你应该做if ((Double.doubleToRawLongBits(foo.x) | 0 ) )(如果它真的是0)