2012-05-30 50 views
6

Soy muy nuevo en html, javascript y css, así que por favor perdone si mi pregunta le suena estúpida. Mi pregunta es cómo puedo evitar que la función toFixed() redondee el número decimal.javascript - cómo evitar Ajustar a números decimales

Aquí está mi enlace: http://jsfiddle.net/RWBaA/4/

Lo que estoy tratando de hacer es que estoy comprobando si la entrada es un número decimal válido siempre que el usuario escribe en el cuadro de texto. Al mismo tiempo, también quiero verificar si la entrada es una moneda válida, lo que significa que solo puede agregar dos números más a la derecha del punto decimal. El problema es cuando el usuario entra en la tercera serie después del punto decimal del segundo número después del punto decimal se redondea a la centésima más cercana si el número es la tercera entrada> = 5.

prueba:

 
    Input   Output 
123456.781 -> 123456.78 

123456.786 -> 123456.79 

¿Por qué mi código no permite las teclas de flecha en cromo?

Por favor ayuda. Si tiene una mejor solución, puede sugerirla. Gracias por adelantado.

Respuesta

10

Ronda el número (hacia abajo) al centavo más próximo primero:

val = Math.floor(100 * val)/100; 

EDITAR Se ha señalado que esta falla por ejemplo, 1.13. ¡Debería haberlo sabido mejor!

Esta falla porque la representación de punto flotante interno de 1,13 es muy poco menos de 1,13 - multiplicando por 100 que no produce 113 pero 112.99999999999998578915 y luego redondeando hacia abajo que lleva al 1,12

Tras volver a leer el pregunta, parece que en realidad solo está tratando de realizar la validación de entrada (ver a continuación), en cuyo caso debe usar técnicas normales de validación de formularios y no debe usar .toFixed() en absoluto. Esa función es para presentando números, sin calcular con ellos.

$('#txtAmount').on('keypress', function (e) { 
    var k = String.fromCharCode(e.charCode); 
    var v = this.value; 
    var dp = v.indexOf('.'); 

    // reject illegal chars 
    if ((k < '0' || k > '9') && k !== '.') return false; 

    // reject any input that takes the length 
    // two or more beyond the decimal point 
    if (dp >= 0 && v.length > dp + 2) { 
     return false; 
    } 

    // don't accept >1 decimal point, or as first char 
    if (k === '.' && (dp >= 0 || v.length === 0)) { 
     return false; 
    } 
}); 
+0

'/ 100,0;'? Esto no es c/C++ – qwertymk

+0

Muchas gracias, resolvió mi problema ... Pero espera ... ¿Por qué no puedo usar las teclas de flecha en google chrome? Funciona bien en Firefox. – TheOnlyIdiot

+3

@qwertymk los viejos hábitos mueren duro ... y eran las 1:30 am ... – Alnitak

4

Además, para evitar toFixed() desde el redondeo de números decimales y para hacer su número en dos cifras decimales se puede usar esto,

val = (Math.floor(100 * val)/100).toFixed(2); 
2

se puede dar a esto un intento, que ganó' t ronda los decimales

var toFixed = function(val, decimals) { 
    var arr = ("" + val).split(".") 
    if(arr.length === 1) 
    return val 
    var int = arr[0], 
     dec = arr[1], 
     max = dec.length - 1 
    return decimals === 0 ? int : 
    [int,".",dec.substr(0, decimals > max ? max : decimals)].join("") 
} 
+0

¡Su función está bien para mí! https://jsfiddle.net/lmcdevloper/gcgyxv46/ Gracias! – lmcDevloper

0

si se quiere evitar el redondeo ... Ex. 1,669 => 1,67, 548.466 => 548,47

El resultado de la función se ve así: 1.669 => 1,66, 548.466 => 548,46

la siguiente función que le ayudará a jQuery. Está probado y funciona correctamente.

<input name="a" type="text" id="a" size="7%" tabindex="2"> 




    $('#a').keyup(function(e){ 
     if($(this).val().indexOf('.')!=-1){ 
      if($(this).val()=="." && $(this).val().length==1){ 
       this.value = parseFloat(0).toFixed(1); 
      }else if($(this).val().split(".")[1].length > 2){     
       if(isNaN(parseFloat(this.value))) 
        return; 
        this.value = $(this).val().split(".")[0]+"."+$(this).val().split(".")[1].substring(0,2); 
      } 
     } 
    }); 
1

Eso es aún más simple:

function truncateToDecimals(num, dec = 2) { 
    const calcDec = Math.pow(10, dec); 
    return Math.trunc(num * calcDec)/calcDec; 
} 

Así:

truncateToDecimals(123456.786) -> 123456.78 
Cuestiones relacionadas