Javascript - как предотвратить toFixed от округления десятичных чисел

Я очень новичок в html, javascript и css, поэтому, пожалуйста, простите, если мой вопрос звучит идиотично для вас. Мой вопрос: как я могу предотвратить функцию toFixed() от округления десятичного числа.

Здесь моя ссылка: http://jsfiddle.net/RWBaA/4/

То, что я пытаюсь сделать, это проверить ввод, если его действительное десятичное число всякий раз, когда пользователь вводит текстовое поле. В то же время я также хочу проверить, является ли вход действительной валютой, что означает, что он может добавить только два числа справа от десятичной точки. Проблема заключается в том, что пользователь вводит третье число после десятичной точки, второе число после округления округленной точки до ближайших сотых, если 3-е число → = 5.

Тестовый ввод:

  Input         Output  
123456.781 -> 123456.78

123456.786 -> 123456.79

Почему мой код не разрешает клавиши со стрелками в хроме?

Пожалуйста, помогите. Если у вас есть лучшее решение, вы можете предложить. Спасибо заранее.

Ответ 1

Сначала округлите число (вниз) до ближайшего значения:

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

Забастовкa >

РЕДАКТИРОВАТЬ. Было указано, что это не удается, например. 1,13. Я должен был знать себя лучше!

Это не так, потому что внутреннее представление с плавающей запятой 1.13 очень немного меньше 1,13 - умножая это на 100, не производит 113, а 112.99999999999998578915, а затем округление вниз до 1,12

Перечитав вопрос, кажется, что вы действительно пытаетесь выполнить проверку ввода (см. ниже), и в этом случае вы должны использовать обычные методы проверки формы, и вы не должны использовать .toFixed() вообще. Эта функция предназначена для представления чисел, а не вычисления с ними.

$('#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;
    }
});

Ответ 2

Это даже проще:

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

Так:

truncateToDecimals(123456.786) -> 123456.78

Ответ 3

Вы можете попробовать это, оно не будет округлять ваши десятичные дроби

/**
 * @param {any} input 
 * @param {number} decimals 
 */
var toFixed = function(input, decimals) {
  var arr = ("" + input).split(".");
  if (arr.length === 1) return input;
  var int = arr[0],
      max = arr[1].length,
      dec = arr[1].substr(0, decimals > max ? max : decimals);
  return decimals === 0 ? int : [int, "." , dec].join("");
}

Ответ 4

Кроме того, чтобы предотвратить toFixed() от округления десятичных чисел и сделать ваш номер в два десятичных знака, вы можете использовать это,

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

Ответ 5

если вы хотите избежать округления... Ex. 1,669 = > 1,67, 548,466 = > 548,47

Результат функции выглядит следующим образом: 1.669 = > 1.66, 548.466 = > 548.46

Тогда вам поможет следующая функция JQuery. Он протестирован и работает правильно.

<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);
            }   
        }
   });