Por que a SEFAZ rejeita sua NF-e (e a culpa é do IEEE 754)
Abra o console do navegador e digite: 1.064 * 39680 // 42219.520000000004 O resultado correto é 42219.52. O seu computador diz 42219.520000000004. Não é bug do JavaScript. É IEEE 754, o padrão de p...
Source: dev.to
Abra o console do navegador e digite: 1.064 * 39680 // 42219.520000000004 O resultado correto é 42219.52. O seu computador diz 42219.520000000004. Não é bug do JavaScript. É IEEE 754, o padrão de ponto flutuante que Python, C, Perl e JavaScript usam para armazenar decimais. É o mesmo motivo pelo qual 0.1 + 0.2 === 0.30000000000000004. Para a maioria das aplicações, a diferença não importa. Para emissão de NF-e no Brasil, importa. A SEFAZ compara o seu cálculo com o dela e rejeita a nota se divergir. Vale dizer: IEEE 754 não é um padrão ruim. Foi desenhado para computação científica, onde precisão relativa importa mais que representação decimal exata. Funciona bem para física, gráficos, machine learning. O problema é que sistemas fiscais precisam de aritmética decimal exata, e isso é fundamentalmente diferente do que IEEE 754 oferece. Neste artigo: onde o erro nasce, por que as soluções óbvias não funcionam e como eliminar o problema na raiz. Índice Rejeição 629: vProd ≠ vUnCom × qCom R