Reino: Code Quality

Códigos de baixa qualidade levam a comportamentos imprevisíveis. Da perspectiva do usuário, isso normalmente se manifesta como usabilidade ruim. Para um invasor, trata-se de uma oportunidade para atacar o sistema de formas imprevistas.

Code Correctness: String Comparison of Float

Abstract
Comparar um valor de ponto flutuante com um objeto String não é confiável e não deve ser feito.
Explanation
Para comparar um valor de ponto flutuante com um objeto String, ele primeiro deve ser transformado em um objeto String, o que normalmente é feito usando uma função como Double.toString(). Dependendo do tipo e do valor da variável de ponto flutuante, quando convertida em um objeto String, ela pode ser "NaN", "Infinity", "-Infinity", ter uma certa quantidade de casas decimais à esquerda contendo zeros ou incluir uma campo de expoente. Se convertida em uma String hexadecimal, a representação também poderá ser consideravelmente diferente.

Exemplo 1: O exemplo a seguir compara a variável de ponto flutuante com uma String.


...
int initialNum = 1;
...
String resultString = Double.valueOf(initialNum/10000.0).toString();
if (s.equals("0.0001")){
//do something
...
}
...
References
[1] NUM11-J. Do not compare or inspect the string representation of floating-point values CERT
[2] Standards Mapping - Common Weakness Enumeration CWE ID 398
desc.dataflow.java.code_correctness_string_comparison_of_float