2011-04-04 12 views
5

Necesito redondear el valor decimal a decimales usando javascript.redondear decimal usando javascript

Ex ,:

16.181 to 16.18 
16.184 to 16.18 
16.185 to 16.19 
16.187 to 16.19 

he encontrado algunas respuestas, pero la mayoría de ellos no redondear 16,185-16,19 ..

+0

@mplungjan, no estoy pidiendo la diferencia entre "Math.round (0) y toFixed (0) ". Si lees mi pregunta, puedes entender que estoy teniendo el problema al redondear 16.185 a 16.19. – Prasad

+0

Estoy realmente sorprendido de ver que el JavaScript dice '16.185 * 100' =' 1618.4999999999998' en FF/Chrome y '1618.5' en IE. Muy extraño. –

+0

Tiene razón. Mi error - sin embargo debe ser un duplicado de algo;) – mplungjan

Respuesta

13
(Math.round((16.185*Math.pow(10,2)).toFixed(1))/Math.pow(10,2)).toFixed(2); 

Si su valor es, por ejemplo, 16.199 redonda normal volverá 16.2 ... pero con este método usted conseguirá los últimos 0 también, ¡así que ves 16.20! Pero tenga en cuenta que el valor volverá como una cadena. Si desea utilizarlo para otras operaciones, hay que parseFloat it :)

Y ahora como función:

function trueRound(value, digits){ 
    return (Math.round((value*Math.pow(10,digits)).toFixed(digits-1))/Math.pow(10,digits)).toFixed(digits); 
} 
+0

Código editado para funcionar como sea necesario ... – ayk

+0

esto es útil. Si lo cambia para que parezca una función, puede ser útil para alguien que tiene el mismo problema que el mío. function formatNumber (myNum, numOfDec) { return (Math.round ((myNum * Math.pow (10, numOfDec)). toFixed (1))/Math.pow (10, numOfDec)). toFixed (numOfDec); } – Prasad

+0

Función agregada para publicar;) – ayk

0

[EDIT] Este código no funciona para una valor como 18.185, como 18.185 * Math.pow (10,2) está siendo evaluado a 1818,4999999999997

Math.round(<value> * Math.pow(10,<no_of_decimal_places>))/Math.pow(10,<no_of_decimal_places>) ; 

Ejemplo: 1234,5678 -> 2 decimales -> 1234,57

Math.round(1234.5678 * Math.pow(10,2))/Math.pow(10,2) ; 
+0

Escribí 10^ en lugar de Math.pow (10 , ) -> Se corrigió –

+0

Esto tampoco funciona. Redondea 16.185 como 16.18. Necesito redondearlo como 16.19 – Prasad

+0

@Prasad: Hmm tienes razón ... extraño –

0
function formatNumber(myNum, numOfDec) { 
     var dec = Math.pow(10, numOfDec); 
     return Math.round(myNum * dec + 0.1)/dec; 
} 
+0

Esto no está funcionando. Redondea 16.185 como 16.18. Necesito redondearlo como 16.19. – Prasad

+0

Hm .. Veo) este es el problema –

+0

Ya sabes, puedes ir de esta manera, sumar 0,1 a tu valor, para evitar casos con 5 valores: 'return Math.round (myNum * dec + 0.1)/dec; ' –

0

El código que está utilizando para el redondeo es correcta. Pero para obtener el resultado deseado, elimine .toFixed (numOfDec) del código.

La función:

función formatNumber (myNum, numOfDec) {

var decimal = 1 
    for (i = 1; i <= numOfDec; i++) 
     decimal = decimal * 10 //The value of decimal determines the number of decimals to be rounded off with (.5) up rule 
    var myFormattedNum = Math.round(myNum * decimal)/decimal 
    return (myFormattedNum) 
} 

espero que le ayuda de alguna manera :)

+0

ya lo intenté y tuve el mismo problema. No está redondeando 16.185 a 16.19 – Prasad

+0

@ Prasad prueba mi solución, ¡dará como resultado lo que necesitas! – ayk

0
parseFloat(myNum.toFixed(numOfDec)) 
2

Gracias @ayk para su respuesta, modificó su función en esto:

function trueRound(value, digits){ 
    return ((Math.round((value*Math.pow(10,digits)).toFixed(digits-1))/Math.pow(10,digits)).toFixed(digits)) * 1; 
} 

sólo tiene que añadir "* 1" porque con la suya, como usted escribió, 16,2 se convierte en 16.20 y yo no necesito el cero en la parte posterior.

1

Uso-

Decimal ds=new Decimal(##.##); 
String value=ds.format(inputnumber); 

Esto funciona perfectamente en mi caso, la esperanza de que va a funcionar al 100%

Cuestiones relacionadas