Não.
Pode até ser em contextos informais, no dia a dia, mas para números de ponto flutuante, são coisas diferentes.
Precisão é - de forma resumida - a quantidade de casas decimais que o tipo suporta.
Exatidão é a capacidade de representar um valor da forma mais… exata possível.
Por causa da forma como os números de ponto flutuante são organizados internamente (seguindo a norma IEEE 754), nem todos os valores podem ser representados com exatidão. Por exemplo:
double x = 0.0;
for (int i = 0; i < 100; i++){
x += 0.1;
}
System.out.println(x); // 9.99999999999998
Somei 0.1
cem vezes, o resultado deveria ser 10, mas foi 9.99999999999998
. Isso acontece porque o 0.1
é um dos muitos valores que não podem ser representados com exatidão, e sim de forma aproximada.
E por mais que aumente a precisão (mais casas decimais), não adianta, o valor continuará não sendo exato.
Dito isso, se está lidando com valores numéricos, não existem caracteres, somente dígitos. Então você teria que transformar o valor em string para depois analisá-lo. Uma alternativa é usar BigDecimal
:
double d = 25.49;
System.out.println(new BigDecimal(String.valueOf(d)).scale()); // 2
Até daria para usar Double.toString
e contar os caracteres depois do ponto, o problema é que valores muito grandes resultam em uma string em notação científica (10 milhões resulta na string 1.0E7
), então usar BigDecimal
acaba tratando esses casos também.
Lembrando que, caso não haja nenhuma casa decimal, scale
pode retornar um número negativo, conforme consta na documentação. Obs: na verdade, para números inteiros, scale
não é o ideal. Mais tarde, se der tempo, vejo uma solução mais geral…