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…
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 🙂
Usa essa biblioteca : http://jsfromhell.com/pt/classes/bignumber
A interoperabilidade de VBScript não é grande. Precisava de uma solução que funcionasse tanto para Linux quanto para MAC, Windows, Firefox, Opera…
Então porque vc não utilizou o VBSCRIPT?
Não… BigDecimal só em Java. Em Visual Basic tem Decimal, que usa 28 bytes.
Não existe um BigDecimal pra usar??