Java 1.6中的Epsilon

时间:2015-06-08 19:48:11

标签: java epsilon

我在一个名为Oracle RPAS的产品上担任顾问,该应用程序是使用C ++开发的。在Oracle RPAS中,可以对JNI调用自定义开发的Java程序来处理数据。 存储在Oracle RPAS for Real中的数据始终为Double(8字节),Java中也提供相同的数据。遗憾的是,Oracle RPAS使用0.0000000001(1e-09)的硬编码值作为epsilon来比较双精度数和其他计算,即使数据作为Double存储在数据库中。 在Java中,我无法找到一种方法来将代码与此硬编码值对齐。我需要以类似的方式比较数据集。这些是数学运算,我需要主要执行 min(double x,double Y),max(double x,double Y)round(double x * double Y)/ double Y),ceil,floor等。

我需要帮助理解epsilon如何在Java中工作? 用于开发的Java版本是1.6

我不是Java方面的专家,并且拥有一些编码经验,任何起点都有助于解决这个问题。

2 个答案:

答案 0 :(得分:0)

epsilon的整个想法应该基于您的应用程序逻辑。如果您打算处理您希望在小数点后第3位有价值的数据,那么请使用像0.0001这样的epsilon。或者类似地,如果您知道您的应用程序将处理高达十亿(1,000,000,000)的数字,那么您知道double可以最精确到第5-6位小数(15位有效数字减去十进制之前的10位数)。因此选择0.000001作为epsilon将是合理的。

据我所知,Java在双重比较期间没有进行任何内部epsilon处理。它需要明确地完成,就像你编写C / C ++时一样。

当然您也可以考虑将BigDecimal作为替代方案。但是,当你进行BigDecimal算术时,你仍然需要定义你想要保持的精度,有一些类似的推理,比如epsilon for double。

答案 1 :(得分:-1)

在Java中,你使用BigDecimal而不是Double,然后根本不需要使用任何epsilon。