我写了一个类来测试相等,小于和大于Java中的两个双重.我的一般情况是比较可以具有半分精度的价格.59.005比59.395.我选择的epsilon适合这些情况吗?
private final static double EPSILON = 0.00001;
/**
* Returns true if two doubles are considered equal. Tests if the absolute
* difference between two doubles has a difference less then .00001. This
* should be fine when comparing prices, because prices have a precision of
* .001.
*
* @param a double to compare.
* @param b double to compare.
* @return true true if two doubles are considered equal.
*/
public static boolean equals(double a, double b){ …Run Code Online (Sandbox Code Playgroud) 当我开始使用相等运算符比较两个浮点值时,我使用的代码审查工具会引用以下内容.什么是正确的方法以及如何做到这一点?是否有一个帮助函数(commons-*),我可以重用它?
描述
无法使用equals(==)运算符比较浮点值
说明
通过使用等式(==)或不等式(!=)运算符来比较浮点值并不总是准确的,因为舍入错误.
建议
比较两个浮点值以查看它们是否接近值.
float a;
float b;
if(a==b)
{
..
}
Run Code Online (Sandbox Code Playgroud) 这是测试浮点值相等性的后续行动:"精度"常量是否有标准名称?.对于平等,
有一个非常相似的问题Double.Epsilon,大于,小于,小于或等于,大于或等于.
众所周知,对两个浮点值x和y的相等测试应该看起来更像这样(而不是简单的=):
abs(x - y)< epsilon ,其中epsilon是一个非常小的值.
如何为epsilon选择一个值?
显然最好选择epsilon尽可能小的值,以获得相等性检查的最高精度.
例如,.NET框架提供一个常量System.Double.Epsilon(= 4.94066×10 -324),表示System.Double大于零的最小正值.
但是,事实证明这个特定值不能可靠地用作epsilon,因为:
0 +
System.Double.Epsilon≠01 +
System.Double.Epsilon= 1(!)
也就是说,如果我理解正确,因为该常数小于机器epsilon.
→这是对的吗?
→这是否也意味着我可以可靠地使用epsilon:= machine epsilon进行相等测试?
删除了这两个问题,因为它们已经与上面提到的第二个SO问题得到了充分的回答.
链接到维基百科的文章说,对于64位浮点数(即double许多语言中的类型),机器epsilon等于:
2 -53,或约.0.000000000000000111(小数点后15个零的数字)
→是否遵循这一点,所有64位浮点值保证精确到14(如果不是15)数字?