2011-03-22 44 views
0

这似乎是一个真正简单的问题,但我只是想澄清我的疑问。我正在查看其他开发人员编写的代码。有一些涉及浮点数的计算。浮点数

例如:Float fNotAvlbl = new Float(-99);他为什么要创建一个新对象?如果我们做Float fNotAvlbl = -99;会发生什么(-99作为标志在这里表示不适用)后下楼的代码中,我们定义:

fltValue1 = 0.00f; 
fltValue2 = 0.00f; 

并与方法调用,它返回浮动填充这两个值。之后,我们这两个值再次转换成与浮动对象:

fltVal1 = new Float(fltValue1); 
fltVal2 = new Float(fltValue2); 

,比做一个比较if(fltVal1.compareTo(fNotAvailable) == 0) do something.
这一切是因为预计的compareTo封装类对象?

我很抱歉,如果这是一个真正的基本问题。

回答

2
  • 写入Float fNotAvlbl = -99;依赖于自动装箱,它只在Java 5中添加,因此旧代码无法使用它。
  • 使用-99作为浮点值意味着“不适用”是真的,真的很糟糕。无论是使用nullFloat.Nan
  • fltVal1.compareTo(fNotAvailable) == 0意味着完全一样fltValue1==fltValue2
  • 严格平等比较浮点值不应该做的,因为它会经常无法按预期运行。阅读The Float-Point Guide了解原因。
+0

只是好奇,你确定'Float'中的'compareTo'没有实现浮点相等/比较问题的某种解决方法吗? – justkt 2011-03-22 16:00:33

+0

谢谢迈克尔。 – t0mcat 2011-03-22 16:05:44

+1

只有两个不同 - 'NaN'和'0.0'对'-0.0'。 – Bozho 2011-03-22 16:07:22

2
  • 你并不需要在所有
  • 即使你需要他们的包装,使用构造不优选 - 使用Float.valueOf(..)代替。
+0

嗨Bozho,感谢您的答复。所以他所做的不是最好的解决方案?你认为这样做有什么理由吗? – t0mcat 2011-03-22 15:55:37

+1

@ t0mcat可能不知道如何以及何时使用包装类型:) – Bozho 2011-03-22 15:57:04

+0

@ t0mcat - 可能是解决浮点平等问题的一种方法。 – justkt 2011-03-22 15:58:43

0

该比较可以使用Float对象,而不是内置型float因为与floating point comparison固有的问题。由于偶尔将浮点数存储在计算机系统中,两个浮点数之间的平等比较会引发误报。 FloatcompareTo可能会考虑到这一点。原作者可能至少认为它的确如此。

您也可以编写自己的浮点比较算法,检查系统的合理标准偏差内的差异。您还可以使用Float中的equals使用的方法,该方法查看每个数字的浮点位的整数值。

请注意,使用Float本身并不能解决此问题,因为问题是存储中的舍入错误。

+0

谢谢justkt .. – t0mcat 2011-03-22 16:01:54

+0

Float.compareTo()和Float.equals()都不考虑NaN以外的任何事情。 – 2011-03-22 16:02:22

+0

@Michael - equals确实使用了一个int比特,但它并不能解决存储问题。 – justkt 2011-03-22 16:06:57

1

论什么compareTo()受试者确实与==

float a = Float.NaN; 
float b = Float.NaN; 
System.out.println(a + " == " + b + " is " + (a == b)); 
System.out.println(a + ".compareTo(" + b + ") is " + ((Float) a).compareTo(b)); 

float c = -0.0f; 
float d = 0.0f; 
System.out.println(c + " == " + d + " is " + (c == d)); 
System.out.println(c + ".compareTo(" + d + ") is " + ((Float) c).compareTo(d)); 

打印

NaN == NaN is false 
NaN.compareTo(NaN) is 0 
-0.0 == 0.0 is true 
-0.0.compareTo(0.0) is -1 

的compareTo比较的二进制表示(归一化所有NaN值后是相同的)作为二进制比较-0.0f和0.0f的表示方式是不同的compareTo不返回0.在代码中没有特殊处理,其他使用floatToIntBits()并比较instea自由度使用==

+0

感谢彼得,例如真的帮助:) – t0mcat 2011-03-22 21:43:33