Вопрос по javascript – Исправлена ли функция JavaScript, дающая странные результаты?

3

Я пытаюсь исправить число до 2 цифр после десятичной и для этого я используюtoFixedФункция JavaScript. Ниже приведены странные результаты, которые я получаю, пожалуйста, проверьте и помогите мне.

var number = 11.995;
number.toFixed(2); // giving me 11.99 which is correct

var number = 19.995;
number.toFixed(2); // giving me 20.00 which is incorrect

Может кто-нибудь сказать мне, почему это происходит.

Спасибо за вашу помощь.

Ваш Ответ

4   ответа
0

toFixed округляет значение. Так как 19.995 находится на полпути между 19.99 и 20.00, он должен выбрать один из них. Традиционно округление предпочитает четный результат (это предотвращает смещение, так как округления и округления будут равны).

Однако некоторые дробные числа с плавающей запятой являются точными, например, 0,5. Тем не менее, похоже, что я ошибся в округлении до нуля, оно всегда округляется.0.5.toFixed(0) это 1,1.5.toFixed(0) это 2.
Это из-за того, что вы сказали ранее, что это не точно. Тот, который точно на полпути вверх.
Нет, это не всегда округляется, и это был оригинальный вопрос. f.ex(11.995).toFixed(2) 11,99
Это не & quot; выбрать & quot ;. 19,995 не являетсяexactly на полпути, так как плавающие числа не являются точными в JavaScript. Вы можете проверить это, добавив19.999991 + 0.000004 который равен19.999995000000002.
1

яется точным двоичным (основание 2). Чтобы было понятнее, придумайте точное число, когда вы делите 10/3.

Для более подробных объяснений, прочитайте это:http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

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

number.toString().substr(0, n);

Или определите функцию как это (сделано за 2 минуты, просто пример):

Number.toFixed = function(no, n) {
    var spl = no.toString().split('.');
    if ( spl.length > 1 ) {
        return spl[0]+'.'+spl[1].substr(0,n);
    }
    return spl[0];
}

Number.toFixed(19.995, 2); // 19.99
@RobW правильно, но теоретически это не было точной заменой. Но спасибо!
Спасибо дружище, все заработало :) Ravinder Singh
0,4 дает только 1 десятичную в этом случае. Вы бы лучше использоватьindexOf чтобы обнаружить точку, или просто используйте RegExp для однострочного:/-?\d+(\.\d{0,2})?/, Примечание: регулярное выражение не является полным, оно не имеет отношения к показателям.
0

которые я догадываюсь. Просто предоставив альтернативное решение здесь.

Вы можете использоватьMath.floor() метод объекта Math для этого.

Что-то вроде этого,Math.floor(number*100)/100

0

    function toFixed(number, precision) {
        var multiplier = Math.pow(10, precision + 1),
            wholeNumber = Math.floor(number * multiplier);
        return Math.round(wholeNumber / 10) * 10 / multiplier;
    }

   //Call this function to retrive exect value
    toFixed((+adjustmentval), 2);

Похожие вопросы