Pergunta

Eu tenho uma função para arredondar um número dado à função para o pence inteiro mais próximo.

<script type='text/javascript'>
Math.roundNumber = function(a,b){
    if(!isNaN(parseInt(a))){
        c = Math.pow(10,b);
        return (Math.round(a*c)/c);
    }
    return false;
}
</script>

no entanto, ele chegou ao meu conhecimento que o referido número introduzido na função só deve ser arredondado para o pence mais próximo no entanto, deve ser arredondado para duas casas decimais.

por exemplo.

15.236562213541684 would = 15.24  
9846.65456169846 would = 9846.66

Eu pensei que seria apenas um caso de mudança retorno (Math.round (a c) / c); Para retorno (Math.ceil (a c) / c);

Obviamente, eu estava muito errado.

Qualquer ajuda sobre este assunto?

EDIT ** **

Aqui está a fórmula que eu estou tentando alcançar talvez ele vai ajudar

a = intrest price
b = terms
c = a/b
d = c*(b-1)
e = a-d

Assim, por exemplo

a = 295.30
b = 156
c = 295.30/156 = 1.90 (rounded up to nearest decimal as above)
d = 1.90 * (b-1) = 294.50
e = 295.30 - 294.50 = 0.80

Alguém pode direita uma função para fazer o acima?

Aqui é um link para o código atual i já incluindo a fórmula ... é uma fórmula muito antiga que eu fiz quando eu comecei JavaScript (que é um tempo atrás agora) no entanto eu ainda não sou melhor agora como eu era naquela época.

Alguém pode limpá-lo para ver se eles podem ver por que não o seu trabalho para coincidir com a função acima?

Foi útil?

Solução

function currency_fix(number)
{
    var unfixed_number = Math.ceil(number.toFixed(5) * 100) / 100;
    return unfixed_number.toFixed(2)
}

var a = currency_fix(295.30)
var b = currency_fix(156)
var c = currency_fix(a / b)
var d = currency_fix(c * (b - 1))
var e = currency_fix(a - d)

document.write(
    'a = ' + a + '<br />' +
    'b = ' + b + '<br />' +
    'c = ' + c + '<br />' +
    'd = ' + d + '<br />' +
    'e = ' + e + '<br />'
)

// OUTPUT
//a = 295.30
//b = 156.00
//c = 1.90
//d = 294.50
//e = 0.80

Eu tenho que dar os resultados desejados neste caso. Não tenho certeza se ele vai trabalhar cada vez, mas parece. Eu definitivamente verificá-la funciona como você quer que ele em primeiro lugar.

Outras dicas

Há um built-in função para isso já, Number.toFixed(numDigits) , por que não usar isso?

Parâmetro: dígitos
O número de dígitos que aparecem depois do ponto decimal; este pode ser um valor entre 0 e 20, inclusive, e implementações podem opcionalmente suportar uma maior gama de valores. Se esse argumento for omitido, ele é tratado como 0.

Returns:
A representação de cadeia de número que não usa a notação exponencial e tem dígitos exatamente dígitos depois do ponto decimal. O número é arredondado, se necessário, e a parte fraccionada é preenchido com zeros se assim necessário que ele tem o comprimento especificado. Se o número é maior do que 1e + 21, este método simplesmente chama Number.toString () e retorna uma string em notação exponencial.

Exemplo:

>>> new Number(15.236562213541684).toFixed(2);
"15.24"
>>> new Number(9846.65456169846).toFixed(2);
"9846.65"

Este último não coincide com o seu exemplo -. 9846.65456169846 arredondado para duas casas decimais deve ser 9846.65, não 9846.66

Seu código é mais complexa do que o que você precisa para esta tarefa. Se você souber o ponto decimal representam sempre um valor estável, independentemente da duração de dígitos em ambos os lados desse ponto decimal você está na sorte.

1), então você deve apenas múltipla seu número original de 100

2) if (Number (x.charAt (indexOf ( "") + 1))> 4) {x + = 1} onde x é o seu número

3) parseInt

4) dividir por 100 e você está feito.

conselho para usar aritmética de ponto fixo é um bom conselho. De ponto fixo Infelizmente, não há aritmética em JavaScript - todos os números são números de ponto flutuante de precisão dupla. (Bem, não aritmética de ponto fixo, sem puxar em alguma biblioteca apoio explícito.)

Para esfregar entrada em campos de texto, eu comecei a lidar com os números como strings (em qualquer medida possível). Cortar a entrada para cima nas partes à esquerda e à direita do ponto decimal, em seguida, o trabalho em valores inteiros (via Math.floor () quando necessário). Se você tem que lidar com dígitos vadios últimos 2ª casa decimal, ou tratá-los como um erro (o que elas significam, afinal?), Ou então, mais uma vez, dividir-los e trabalhar com eles como inteiros.

Se você é não lidar com valores fornecidos pelo usuário (ou seja, coisas de campos de entrada de texto), então você realmente não deveria estar fazendo isso em Javascript, porque, novamente, você don' t tem as ferramentas numéricas que você realmente precisa.

Substituir Math.round() com Math.ceil() deve funcionar:. O bug deve estar em outro lugar

Além disso, eu sugiro deixar cair a isNaN(parseInt()) completamente quanto as funções matemáticas vai lançar para o número de qualquer maneira, retornando NaN se isso não é possível. Isto levará à função retornando NaN bem, o que é um ajuste melhor do que boolean false.

E btw: é uma má idéia para usar a matemática de ponto flutuante com valores monetários: Use fixo aritmética de ponto em vez


Agora que sabemos o que você está tentando fazer, aqui está o código que calcula os valores desejados para o seu exemplo:

var value = 295.30;
var count = 156;
var payment = Math.ceil(value * 100 / count) / 100;
var last_payment = Math.round((value - (count - 1) * payment) * 100) / 100;

Alterar round() para ceil() para todos os cálculos não funcionou como o último pagamento tem de ser arredondado normalmente para compensar as imprecisões devido ao uso de valores de ponto flutuante.

Em geral, é melhor apenas matemática uso inteiro, então multiplicar todos os valores com 100 e converter apenas quando a saída de valores:

var value = 29530;
var count = 156;
var payment = Math.ceil(value / count);
// rounding no longer necessary as integer math is precise:
var last_payment = value - (count - 1) * payment;

Não, você estava certo.

Eu testei seu código com a modificação celular, e ele funciona.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top