[RESOLVIDO] Ajuda Double.toString()

Galera,

Estou trabalhando com o Hibernate validator 4 (JSR 303) e estou validando um campo utilizando a anotação @Digits, mas estou tendo um problema sério.

Preciso validar um valor com 3 casas decimais.

Ex:


...
@Digits(integer=12,fraction=3,message="O peso bruto do volume está fora dos limites. {contraint.digits}")
private Double pesoBruto;
..

Até ai beleza, mas o problema é que o usuario está me passando o valor 0.001 e a validação está dando erro, mas não teoria não era pra dar esse erro pois 0.001 tem 3 casas decimais.

Olhando o fonte da annotation @Digits percebi que usa o metodo toString para criar um BigDecimal para então pegar a parte inteira e a parte fracional do número:

...
    public static boolean isValid(Number num) {
        //null values are valid
        if (num == null) {
            return true;
        }

        BigDecimal bigNum;
        if (num instanceof BigDecimal) {
            bigNum = (BigDecimal) num;
        } else {
            bigNum = new BigDecimal(num.toString());
        }

        int integerPartLength = bigNum.precision() - bigNum.scale();
        int fractionPartLength = bigNum.scale() < 0 ? 0 : bigNum.scale();

        return (maxIntegerLength >= integerPartLength && maxFractionLength >= fractionPartLength);
    }
...

O grande problema ta que quando tem a chamada de num.toString() o meu número que é 0.001 passa a ser 0.0010 :frowning: e a validação falha.

Seria isso um bug da classe Double? ou eu que estou fazendo algo de errado ? alguém já passou por isso?

Abraços

Acho é que a implementação de @Digits é que está bugada.

Qual é a diferença entre "0.0010" e "0.001"? Absolutamente nenhuma.

Submeta isso como um bug para o pessoal do Hibernate Validator, porque o mesmo problema vai aparecer com os números de 0.001 a 0.009.

class TesteDoubleToString {
    public static void main(String[] args) {
        // Mostra &quot;0.0010&quot;
        System.out.println (Double.valueOf (0.001).toString());
        // O código a seguir mostra: 
/*
0.0010
0.0010
0.0020
0.0030
0.0040
0.0050
0.0060
0.0070
0.0080
0.0090
 */
        for (int i = 1; i &lt;= 999; ++i) {
            String s = Double.valueOf (i / 1000.0).toString();
            if (s.length() &gt; 5) {
                System.out.println (s);
            }
        }
    }
}

Exatamente matematicamente os números são iguais.

Obrigado thingol. Vou reportar isso como um bug para o pessoal do hibernate validator.

Abraço

https://forum.hibernate.org/viewtopic.php?f=9&t=998581&sid=3d79a3359eb24f7ea2d93cce63ef1d98