999.999.999,9999999

Operações em ponto flutuante (floating point operations) para um computador são tão difíceis quando divisões e multiplicações em base binária para seres humanos.

Olha um exemplo de multiplicação em JavaScript:

151.95 * 100 = 14194.999999999998

Uma operação que pode parecer exata para nós, para os computadores é uma aproximação.

Isso ocorre porquê o computador trabalha com base 2 (binária) e não base 10 (decimal). Para 95% das pessoas que não entenderam o que isso realmente significa, é interessante ler o Decimal Arithmetic FAQ, da IBM (em inglês).

Felizmente muitos matemáticos loucos trabalharam nesse assunto por muito tempo, em grandes empresas, famosas universidades e com financiamento de governos de países ricos. Com isso temos o IEEE 754 (define precisão single e double) e 754r (define precisão quad e multi).

Então isso quer dizer que todos nossos problemas estão resolvidos? Não. Isso quer dizer que a maioria de nossos problemas cotidianos estão resolvidos. JavaScript é uma excessão à regra. Visual Basic, C, C++, C#, Java, Fortran e muitas outras linguagens trabalham com dados decimais em sintonia com o IEEE 754.

Mas por que eu escrevi tudo isso? Simplesmente por quê precisei criar uma aplicação para conciliar quantidades com 11 dígitos inteiros e 7 decimais, fora do limite do double … Pego dados no banco de dados SQL Server, trabalho em componentes Visual Basic 6, valido somatórias com JavaScript, mando por EntireX para mainframe e em cada integração tenho de fazer malabarismos para não perder significância dos últimos dígitos e nem arredondar os valores…

Deixe um Comentário

6 Comentários.

  1. Silvio, obrigado pela dica, vou dar uma olhada, mas agora a solução já está implantada e em uso.

    Fica para o próximo projeto 🙂

  2. A interoperabilidade de VBScript não é grande. Precisava de uma solução que funcionasse tanto para Linux quanto para MAC, Windows, Firefox, Opera…

  3. Então porque vc não utilizou o VBSCRIPT?

  4. Não… BigDecimal só em Java. Em Visual Basic tem Decimal, que usa 28 bytes.

  5. Não existe um BigDecimal pra usar??

Não fique de fora, dê sua opinião!

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.