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

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

Вот моя ссылка:http://jsfiddle.net/RWBaA/4/

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

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

  Input         Output  
123456.781 -> 123456.78

123456.786 -> 123456.79

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

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

 user20272925 июн. 2018 г., 16:43
Very related, В этом конкретном случае, поскольку входные данные уже являются строкой, их не нужно преобразовывать в число с плавающей запятой, но есть некоторые повторяющиеся ответы.

Ответы на вопрос(5)

Ex. 1,669 = & gt; 1,67, 548,466 = & gt; 548,47

Результат функции выглядит следующим образом: 1.669 = & gt; 1,66, 548,466 = & gt; 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);
            }   
        }
   });
Решение Вопроса

Round the number (down) to the nearest cent first:

EDIT Было указано, что это терпит неудачу, например, например, 1,13. Я должен был знать лучше себя!

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

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

$('#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;
    }
});
 30 мая 2012 г., 02:56
/ 100.0; ? Это не t c / c ++
 16 сент. 2015 г., 18:17
Это не всегда работает. Пытаться:Math.floor(100 * 1.13) / 100;
 30 мая 2012 г., 08:52
@qwertymk старые привычки тяжело умирают ... и это было 1:30 утра ...
 TheOnlyIdiot30 мая 2012 г., 03:03
Большое спасибо, это решило мою проблему ... Но подождите ... Почему я не могу использовать клавиши со стрелками в Google Chrome? Работает нормально в Firefox.

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

val = (Math.floor(100 * val) / 100).toFixed(2);
 22 авг. 2018 г., 23:23
не всегда работает. 4492903605.9 производит 4492903605.89

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

Так:

truncateToDecimals(123456.786) -> 123456.78
 22 авг. 2018 г., 23:21
не всегда работает. 4492903605.9 производит 4492903605.89
 23 авг. 2018 г., 16:56
Это связано с тем, что вы добавляете новое десятичное число, поскольку значение по умолчанию для параметра dec равно 2. Можно передать значение dec = 1 или исправить функцию, чтобы получить длину десятичных знаков по умолчанию из переданного числа.

оно не будет округлять ваши десятичные дроби

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("")
}
 11 июл. 2017 г., 11:24
Ваша функция в порядке для меня!jsfiddle.net/lmcdevloper/gcgyxv46  Спасибо!

Ваш ответ на вопрос