Escrito nas palavras anteriores:
Hoje, ajudei meu colega a resolver um problema, que é que existem muitos lugares decimais que aparecem ao multiplicar decimais. Eu já encontrei esse problema antes, então o resumirei especificamente;
Tipo de número:
O tipo de número é o tipo mais usado e mais interessante no ECMAScript; Esse tipo usa o formato IEEE754 para representar números inteiros e valores de ponto flutuante (os valores do ponto flutuante também são valores de precisão dupla em alguns idiomas). Para suportar vários tipos de dados, o ECMA-262 define diferentes formatos de superfície numérica.
Decimal:
var intnum = 10; // Inteiro
Octal:
var octalnum1 = 070; // Octal 56
var octalnum2 = 079; // Resolvido por valor octal inválido como 79
Os literais octais são inválidos no modo rigoroso;
hexadecimal:
var hexnum1 = 0xa; // 10
Lembre -se: ao executar operações, todos os valores expressos em octal e hexadecimal são finalmente convertidos em decimal;
Por que a operação de decimais tem erros?
O maior progresso de um valor de ponto flutuante é um decimal de 17 dígitos, mas sua precisão é muito menor que a de um número inteiro ao executar operações; Os números inteiros serão convertidos em decimal ao executar operações; E ao calcular operações decimais em Java e JavaScript, os decimais decimais serão convertidos primeiro ao binário correspondente, e alguns decimais não podem ser completamente convertidos em binário, portanto o primeiro erro ocorre aqui. Depois que todos os decimais são convertidos em binário, as operações binárias são realizadas para obter o resultado binário. Em seguida, converta o resultado binário em decimal e o segundo erro geralmente ocorre aqui.
Então (0,1+0,2)! = 03
Solução:
Código do programa
Função de divisão para obter resultados precisos da divisão
Nota: Haverá erros no resultado da divisão do JavaScript, que será mais óbvio ao dividir dois números de ponto flutuante. Esta função retorna um resultado de divisão mais preciso.
Ligue para: accdiv (arg1, arg2)
Valor de retorno: o resultado exato de Arg1 dividido por Arg2
função accdiv (arg1, arg2) {var t1 = 0, t2 = 0, r1, r2; tente {t1 = arg1.toString (). split (".") [1] .Length} catch (e) {} tente {t2 = arg2.toString (). split (".") [1] .Length} catch (e) {} com (math) {r1 = número (number (arg1.tossring} (e) {} com (math) {r1 = número (número (arg1.toss. r2 = número (arg2.toString (). substituir (".", ")) retornar (r1/r2)*pow (10, t2-t1);}}Adicionar um método DIV ao tipo de número é mais conveniente para ligar.
Número.prototype.div = function (arg) {return accdiv (this, arg); }Função de multiplicação para obter resultados precisos de multiplicação
Nota: Haverá erros no resultado da multiplicação do JavaScript, que será mais óbvio ao multiplicar dois números de ponto flutuante. Esta função retorna um resultado de multiplicação mais preciso.
Ligue para: accmul (arg1, arg2)
Valor de retorno: o resultado exato de Arg1 multiplicado por Arg2
função accmul (arg1, arg2) {var m = 0, s1 = arg1.toString (), s2 = arg2.toString (); tente {m+= s1.split (".") [1] .Length} catch (e) {} tente {m+= s2.split (".") [1] .Length} Catch (e) {} Número de retorno (s1.replace (".", ")**número (s2.replace (}" ".Adicionar um método MUL ao tipo de número é mais conveniente para ligar.
Número.prototype.mul = function (arg) {return accmul (arg, this);}Função de adição para obter resultados de adição precisos
NOTA: Haverá erros no resultado do JavaScript, que será mais óbvio ao adicionar dois números de ponto flutuante. Esta função retorna um resultado de adição mais preciso.
Ligue para: Accadd (Arg1, Arg2)
Valor de retorno: o resultado exato de arg1 mais arg2
função acadd (arg1, arg2) {var r1, r2, m; tente {r1 = arg1.toString (). split (".") [1] .Length} Catch (e) {r1 = 0} tente {r2 = arg2.tostring (). split ("") [1] .length} catch (e) {r2 = 0} m = math.pow (10, 10, math.M. (arg1*m+arg2*m)/m}Adicione um método Adicionar ao tipo de número, tornando mais conveniente ligar.
Número.prototype.add = function (arg) {return accadd (arg, this);}Inclua essas funções em que você deseja usar e depois ligue para calcular.
Por exemplo, se você deseja calcular: 7*0,8, então altere -o para (7) .mul (8)
Outras operações são semelhantes e resultados mais precisos podem ser obtidos.
Solução 2:
Os métodos mais comumente usados, os métodos tofixed () e tofixed () podem arredondar o número em números com um número decimal especificado. Adicionar esse método após os resultados do cálculo está ok; Mas terá um pequeno impacto na precisão. Se os requisitos de precisão não forem altos, é recomendável usá -lo;