Conforme o ultimo artigo, na plataforma Intel ocorre problema de precisao para numero ponto flutuante quando se tenta multiplicar com o operador padrao "*".Este problema e bastante severo quando o sistema trata de transacoes comerciais ou financeiras, porque sao dois tipos de transacoes que nao podem ter erro de precisao, senao os numeros nao batem na contabilidade e em casos mais graves, quando se trata de sistemas de recargas, isso e mais critico ainda porque e a populacao humana quem sofre o onus da falha. Claro, existem "n" impactos.Para contornar o problema em qualquer linguagem, basta usar a seguinte logica: double tempValue = value * 100; tempValue = Math.floor(tempValue + 0.5);Pronto!Nao, vamos fazer uma classe com as funcoes e testes dos erros e da solucao:Classe FloatToIntegerO nome da classe nao tem nada a ver com os tipos numericos do Java, e apenas uma forma de dizer que esta classe trata de transformar numero flutuantes em numeros inteiros.Dentro desta classe existem as seguintes funcoes auxiliares:doubleToLong - esta funcao converte double para long;doubleToInt - esta funcao converte double para int;floatToInt - esta funcao converte float para int;floatToShort - esta funcao converte float para short.Para todas as funcoes, os parametros sao value e scale:value - e o valor flutuante;scale - e o numero de casas decimais e value para a funcao saber como transformar o flutuante em inteiro.Codigopublic class FloatToInteger { public static long doubleToLong(double value, int scale) { double tempValue = value * Math.pow(10, scale); tempValue = Math.floor(tempValue + 0.5); return (long) tempValue; } public static int doubleToInt(double value, int scale) { double tempValue = value * Math.pow(10, scale); tempValue = Math.floor(tempValue + 0.5); return (int) tempValue; } public static int floatToInt(float value, int scale) { double tempValue = value * Math.pow(10, scale); tempValue = Math.floor(tempValue + 0.5); return (int) tempValue; } public static short floatToShort(float value, int scale) { double tempValue = value * Math.pow(10, scale); tempValue = Math.floor(tempValue + 0.5); return (short) tempValue; } public static void main(String[] args) { troubleSimulation(); solutionSimulation(); } public static void troubleSimulation() { int erros = 0; /*********************** * Provocar ate 5 erros para amostragem do problema * ao usar a multiplicacao comum ***********************/ double decimalValue = 0.01d; long singleNumber = 0L; System.out.println("1) AMOSTRAGEM DO PROBLEMA - Com o problema"); while (true) { if (decimalValue >= 100.0d) { break; } decimalValue += 0.10d; singleNumber = (long) (decimalValue * 100); if (singleNumber != doubleToLong(decimalValue, 2)) { if (erros <= 5) { System.err.println(String.format(" ERROR: Original: %.20f, After: %d", decimalValue, singleNumber)); } erros++; } } System.out.println(String.format("Populacao: %.0f, Total de erros: %d\n", 100 / 0.10, erros)); } public static void solutionSimulation() { int erros = 0; /*********************** * Provocar ate 5 erros para amostragem do problema * ao usar a multiplicacao comum ***********************/ double decimalValue = 0.01d; long singleNumber = 0L; System.out.println("2) AMOSTRAGEM DE PROBLEMAS - Apos com a solucao"); while (true) { if (decimalValue >= 100.0d) { break; } decimalValue += 0.10d; singleNumber = doubleToLong(decimalValue, 2); if (singleNumber != doubleToLong(decimalValue, 2)) { if (erros <= 100) { System.err.println(String.format(" ERROR: Original: %.20f, After: %d", decimalValue, singleNumber)); } erros++; } } System.out.println(String.format("Populacao: