我有一些像这样的代码:
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) {
}
}
我基本上希望将来避免被零除的例外。
由于
答案 0 :(得分:44)
未明确初始化时,类范围中的数字基元初始化为零。
必须显式初始化本地范围内的数字基元(方法中的变量)。
如果您只担心除零除外,请检查您的双精度 零是否正常。
if(value != 0)
//divide by value is safe when value is not exactly zero.
否则在检查浮点值(如double
或float
)是否为0时,使用错误阈值来检测值是否接近0,但不是< strong>相当 0。
public boolean isZero(double value, double threshold){
return value >= -threshold && value <= threshold;
}
答案 1 :(得分:8)
是;所有原始数字类型都默认为0
。
但是,涉及浮点类型(double
和float
)的计算可能不准确,因此通常最好检查它是否关闭到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.0
和foo.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)