我想从那些double在Java中使用原始相等经验的人那里得到一些建议.使用d1 == d2两个双打d1并且d2由于可能的舍入误差而不够.
我的问题是:
Java是否Double.compare(d1,d2) == 0在某种程度上处理舍入错误?如1.7文档中所述,0如果d1在数值上等于,则返回值d2.是否有人确定它们在数值上是什么意思?
对某些delta值使用相对误差计算,是否会推荐使用delta的通用(非特定于应用程序)值?请参阅下面的示例.
下面是考虑相对误差来检查相等性的通用函数.delta您建议从简单的操作+, - ,/,*操作中捕获大多数舍入错误的价值是多少?
public static boolean isEqual(double d1, double d2) {
return d1 == d2 || isRelativelyEqual(d1,d2);
}
private static boolean isRelativelyEqual(double d1, double d2) {
return delta > Math.abs(d1- d2) / Math.max(Math.abs(d1), Math.abs(d2));
}
Run Code Online (Sandbox Code Playgroud) 我创建了一个Runnable类,负责监视目录中的文件更改.
... imports ...
public class ExamplePathWatch implments Runnable {
...
private boolean isRunning = true;
...
@Override
public void run() {
while(isRunning) {
[1]... wait for a file change ...
[2]... notify listeners of file change (if any) ...
}
}
public synchronized void stopPathWatch() {
isRunning = false;
... interrupt [1] and allow the thred to exit immediately...
}
Run Code Online (Sandbox Code Playgroud)
线程在[1]处暂停,直到发生文件更改,或者stopPathWatch()调用方法来设置isRunning = false和中断在[1]处的当前等待.
在主应用程序退出之前,stopPathWatch()调用它允许线程退出并且整个应用程序完全终止.
我的问题是,当应用程序崩溃时,主应用程序终止,而不会stopPathWatch()被调用.因此,应用程序会在后台无限期地运行,直到它通过操作系统被杀死.
由于应用程序上有非常活跃的开发并且并未处理所有异常,因此无论主应用程序如何终止,是否有建议的方法来确保子线程被停止?
谢谢