Pregunta

Tengo una función para redondear un número dado a la función al penique más cercano.

<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>

Sin embargo, ha llegado a mi conocimiento que el citado número introducido en la función sólo debe ser redondeado al céntimo más cercano sin embargo, debe ser redondeado a dos decimales.

por ejemplo.

15.236562213541684 would = 15.24  
9846.65456169846 would = 9846.66

pensé que sería sólo un caso de cambiar     retorno (Math.round (a c) / c); A     retorno (Math.ceil (a c) / c);

Obviamente, yo estaba muy mal.

Cualquier ayuda en este asunto?

** ** EDITAR

Esta es la fórmula que yo estoy tratando de lograr lo mejor que va a ayudar

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

Así, por ejemplo

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

puede alguien derecha una función para hacer lo anterior?

Aquí es un enlace al código actual que he incluyendo la fórmula ... es una fórmula muy antigua que hice cuando empecé a JavaScript (que es un tiempo hace ahora) sin embargo todavía estoy mejor ahora, al volver era entonces.

Puede alguien limpiarlo para ver si se puede ver por qué no su trabajo para que coincida con la función anterior?

¿Fue útil?

Solución

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

Lo tengo para dar los resultados que desea en este caso. No estoy seguro si va a funcionar cada vez, pero parece. Sin duda lo compruebe que funciona como quiera que a primera.

Otros consejos

Hay una función incorporada para esto ya, Number.toFixed(numDigits) , ¿por qué no usar esto?

  

Parámetros: Dígitos
  El número de dígitos que aparezca después del punto decimal; esto puede ser un valor entre 0 y 20, inclusive, y las implementaciones puede soportar opcionalmente una gama más amplia de valores. Si se omite este argumento, se trata como 0.

     

Devuelve:
  Una representación de cadena del número que no utiliza la notación exponencial y tiene exactamente dígitos dígitos después del punto decimal. El número se redondea si es necesario, y la parte fraccional se rellena con ceros si es necesario para que tenga la longitud especificada. Si el número es mayor que 1e + 21, este método simplemente llama Number.toString () y devuelve una cadena en notación exponencial.

Ejemplo:

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

Este último no coincide con su ejemplo -. 9846.65456169846 redondeado a dos decimales debe ser 9846.65, no 9846.66

Su código es más complejo que lo que necesita para esta tarea. Si conoce el punto decimal siempre representará un valor estable independientemente de la duración de dígitos a cada lado del punto decimal que estás de suerte.

1) A continuación, debe simplemente múltiple su número original de 100

2) si (Número (x.charAt (IndexOf ( "") + 1))> 4) {x + = 1} donde x es el número de su

3) parseInt

4) se divide por 100 y ya está.

Los consejos para utilizar aritmética de punto fijo es un buen consejo. Por desgracia, que no hay aritmética de punto fijo en Javascript - todos los números son números de coma flotante de doble precisión. (Bueno, no aritmética de punto fijo sin tirar de alguna biblioteca de soporte explícito.)

Para fregar de entrada en campos de texto, he empezado a tratar con los números como cadenas (en cualquier grado posible). Picar la entrada arriba en las partes a la izquierda y derecha del punto decimal, entonces el trabajo en valores enteros (a través de Math.floor () cuando sea necesario). Si usted tiene que lidiar con los dígitos callejeros más allá de la segunda posición decimal, o bien tratarlos como un error (¿qué significan todos modos?) O de lo contrario, una vez más, ellos escindido y trabajar con ellos como enteros.

Si eres no se trata de los valores suministrados por el usuario (es decir, cosas de los campos de entrada de texto), entonces usted realmente no debería estar haciendo esto en Javascript, porque, de nuevo, usted don' t tiene las herramientas numéricas que realmente necesita.

Sustitución Math.round() con Math.ceil() debe trabajar:. El error debe estar en otro lugar

Además, sugiero dejar caer el isNaN(parseInt()) completamente como las funciones matemáticas echarán a número de todos modos, volviendo NaN si eso no es posible. Esto conducirá a la función que devuelve NaN, así, que es un mejor ajuste que false booleano.

Y por cierto: que es una mala idea utilizar cálculos de coma flotante con valores monetarios: utilizar la aritmética de punto fijo en su lugar

!

Ahora que sabemos lo que estamos tratando de hacer, aquí está el código que calcula los valores deseados para su ejemplo:

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;

Cambiar round() a ceil() para todos los cálculos no funcionaba como el último pago tiene que ser redondeada normalmente para compensar las imprecisiones debido al uso de valores de punto flotante.

Por lo general es mejor que solamente matemáticas uso número entero, de modo multiplicar todos los valores con 100 y convertir sólo cuando la salida los 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;

No, tenías razón.

He probado el código con la modificación de células, y funciona.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top