Відформатування числа з використанням рівно двох десяткових знаків у JavaScript


571

У мене є цей рядок коду, який округляє мої числа до двох знаків після коми. Але я отримую такі цифри: 10,8, 2,4 і т. Д. Це не моє уявлення про два знаки після коми, як я можу вдосконалити наступне?

Math.round(price*Math.pow(10,2))/Math.pow(10,2);

Я хочу, щоб такі цифри, як 10.80, 2.40, і т. Д. Використання jQuery зі мною добре.


1
Ваш код - саме те, що я шукав (щоб зменшити точність поплавця до 7 знаків після коми для меншого файлу JSON) Пропуск Math.pow для швидкості val = Math.round (val * 10000000) / 10000000);
Pawel

Оскільки в даний час загальноприйнятий відповідь дає , можливо , неправильний результат для широкого діапазону значень завдяки обтяжуючою неточностей властивих чисел ( 0.565, 0.575, 1.005), я можу запропонувати ще раз , дивлячись на це відповідь , який отримує їх виправити?
TJ Crowder

Можливо, ви хочете включити бібліотеку sprintf для JavaScript stackoverflow.com/questions/610406/…
Thilo

Після правильного округлення методом зміщення десяткового місця та округлення ви можете використати number.toFixed(x)метод для перетворення його в рядок з необхідною кількістю нулів. Наприклад , круглий , 1.34щоб 1.3за допомогою методу крос-браузер потім додати 1 нуль і зверненого в рядок з 1.3.toFixed(2)(щоб отримати "1.30").
Едуард

Відповіді:


999

Щоб відформатувати число за допомогою позначення фіксованої точки, ви можете просто скористатися методом toFixed :

(10.8).toFixed(2); // "10.80"

var num = 2.4;
alert(num.toFixed(2)); // "2.40"

Зверніть увагу, що toFixed()повертає рядок.

ВАЖЛИВО : Зауважте, що toFixed не округляє 90% часу, він поверне закруглене значення, але для багатьох випадків це не працює.

Наприклад:

2.005.toFixed(2) === "2.00"

ОНОВЛЕННЯ:

Сьогодні ви можете використовувати Intl.NumberFormatконструктор. Це частина специфікації API інтернаціоналізації ECMAScript (ECMA402). Він має досить хорошу підтримку браузера , в тому числі навіть IE11, і вона повністю підтримується в Node.js .

const formatter = new Intl.NumberFormat('en-US', {
   minimumFractionDigits: 2,      
   maximumFractionDigits: 2,
});

console.log(formatter.format(2.005)); // "2.01"
console.log(formatter.format(1.345)); // "1.35"

Можна також скористатися toLocaleStringметодом, який внутрішньо використовуватиме IntlAPI:

const format = (num, decimals) => num.toLocaleString('en-US', {
   minimumFractionDigits: 2,      
   maximumFractionDigits: 2,
});


console.log(format(2.005)); // "2.01"
console.log(format(1.345)); // "1.35"

Цей API також надає вам широкий спектр варіантів форматування, наприклад, тисячі роздільників, символів валюти тощо.


17
Не працює послідовно у всіх браузерах, тобто (0.09).toFixed(1);дає 0,0 в IE8
ajbeaven

41
виправлено не кругло, ви можете зробити це спочатку: (Math.round (0,09)). toFixed (1);
рекан

32
@rekans: Це неправильно. Math.Round(0.09)повернеться, 0тому це завжди дасть 0.0...
Кріс

28
Це погана ідея в більшості ситуацій, вона перетворює число в рядок або число з плаваючою точкою в деяких випадках.
Попелястий блакитний

80
Тут треба погодитися з @AshBlue ... це безпечно лише для форматування представлення значень. Може порушити код з подальшими розрахунками. В іншому випадку Math.round(value*100)/100працює краще для 2DP.
UpTheCreek

98

Це стара тема, але все ще найкращі результати Google та запропоновані рішення поділяють ту саму проблему з десятковою комою з плаваючою комою. Ось (дуже загальна) функція, яку я використовую, завдяки MDN :

function round(value, exp) {
  if (typeof exp === 'undefined' || +exp === 0)
    return Math.round(value);

  value = +value;
  exp = +exp;

  if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0))
    return NaN;

  // Shift
  value = value.toString().split('e');
  value = Math.round(+(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp)));

  // Shift back
  value = value.toString().split('e');
  return +(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp));
}

Як ми бачимо, у нас таких проблем немає:

round(1.275, 2);   // Returns 1.28
round(1.27499, 2); // Returns 1.27

Ця щедрість також забезпечує деякі цікаві речі:

round(1234.5678, -2);   // Returns 1200
round(1.2345678e+2, 2); // Returns 123.46
round("123.45");        // Returns 123

Тепер, щоб відповісти на питання ОП, потрібно набрати:

round(10.8034, 2).toFixed(2); // Returns "10.80"
round(10.8, 2).toFixed(2);    // Returns "10.80"

Або для більш короткої, менш родової функції:

function round2Fixed(value) {
  value = +value;

  if (isNaN(value))
    return NaN;

  // Shift
  value = value.toString().split('e');
  value = Math.round(+(value[0] + 'e' + (value[1] ? (+value[1] + 2) : 2)));

  // Shift back
  value = value.toString().split('e');
  return (+(value[0] + 'e' + (value[1] ? (+value[1] - 2) : -2))).toFixed(2);
}

Ви можете зателефонувати за допомогою:

round2Fixed(10.8034); // Returns "10.80"
round2Fixed(10.8);    // Returns "10.80"

Різні приклади та тести (завдяки @ tj-crowder !):


1
Як не існує простого способу зробити це? ES6 на допомогу?
zero_cool

Дякуємо, що розмістили полін MDN. На пов’язаній сторінці MDN поліфіли вже немає. Цікаво, чому його зняли ...
Кінг Холлі

43

Зазвичай я додаю це в мою особисту бібліотеку, і після деяких пропозицій та використання рішення @TIMINeutron також роблячи його пристосованим до десяткової довжини, це найкраще підходить:

function precise_round(num, decimals) {
   var t = Math.pow(10, decimals);   
   return (Math.round((num * t) + (decimals>0?1:0)*(Math.sign(num) * (10 / Math.pow(100, decimals)))) / t).toFixed(decimals);
}

працюватиме за винятками, про які повідомлялося.


2
точний_круг (1.275,2) - 1,27?
allenhwkim

2
@Imre Змінити значення повернення на (Math.round (число * Math.pow (10, десяткових знаків)) / Math.pow (10, десяткових знаків)). Tofix (2); і цього питання у вас більше не буде.
dkroy

6
де ви оголошуєте "знак" і "відміняти", якщо ваша друга функція підібрана так, як це не повинно бути у них не визначеною?
Аді Нгом

2
Я додав обхід для методу знаку пропускання в IE: gist.github.com/ArminVieweg/28647e735aa6efaba401
Армін

1
@Armin Виправлення також працює в Safari. Оригінальна функція не працювала в Safari.
Дейв

19

Я не знаю, чому я не можу додати коментар до попередньої відповіді (можливо, я безнадійно сліпий, не знаю), але я придумав рішення, використовуючи відповідь @ Мігеля:

function precise_round(num,decimals) {
   return Math.round(num*Math.pow(10, decimals)) / Math.pow(10, decimals);
}

І два його коментарі (від @bighostkim та @Imre):

  • Проблема з precise_round(1.275,2)неповерненням 1.28
  • Проблема з тим, що precise_round(6,2)не повернутись 6.00 (як він хотів).

Моє остаточне рішення таке:

function precise_round(num,decimals) {
    var sign = num >= 0 ? 1 : -1;
    return (Math.round((num*Math.pow(10,decimals)) + (sign*0.001)) / Math.pow(10,decimals)).toFixed(decimals);
}

Як ви бачите, мені довелося додати трохи "виправлення" (це не те, що воно є, але оскільки Math.round втрачає - ви можете перевірити це на jsfiddle.net - це єдиний спосіб, який я знав, як "виправити" "це). Він додає 0,001 до вже доданого числа, тому він додає 1три 0s праворуч від десяткового значення. Тож воно має бути безпечним у використанні.

Після цього я додав .toFixed(decimal)завжди виводити число у правильному форматі (з потрібною кількістю десяткових знаків).

Так що це майже все. Використовуйте це добре;)

EDIT: додана функціональність до "виправлення" від'ємних чисел.


2
"Виправлення" переважно безпечне, але, наприклад, precise_round(1.27499,2)зараз також повертає 1,28 ... Це не Math.roundте, що втрачає; так, як комп'ютери внутрішньо зберігають значення з плаваючою комою. В основному, ви приречені на збій з деякими значеннями, перш ніж дані навіть перейдуть на вашу функцію :)
Імре

@Imre, ти абсолютно не маєш рації. Ось чому я пояснюю, що це робить 0,001, якщо хтось хоче зробити його "більш точним " або навіть видалити його (якщо у вас супер суперкомп'ютер із 2 Мбайт на плаваюче, я не думаю, що тут хтось робить ;)
tfrascaroli

1
Власне, мовна специфікація досить специфічна щодо використання 64 біт для значень чисел, тому наявність / використання суперкомп'ютера нічого не змінить :)
Імре

для 0,001 ви можете замінити, додавши багато нулів відповідно до довжини десяткових знаків. так ..
Мігель

15

Один із способів бути 100% впевненим, що ви отримаєте число з 2 десятковою комою:

(Math.round(num*100)/100).toFixed(2)

Якщо це спричиняє помилки округлення, ви можете використовувати наступне, як Джеймс пояснив у своєму коментарі:

(Math.round((num * 1000)/10)/100).toFixed(2)

6
Це найкращий, найпростіший спосіб зробити це. Однак через математику з плаваючою комою 1,275 * 100 = 127,49999999999999, що може спричинити незначні помилки в округленні. Щоб виправити це, ми можемо помножити на 1000 і ділити на 10, як (1,275 * 1000) / 10 = 127,5. Таким чином: var answer = (Math.round((num * 1000)/10)/100).toFixed(2);
Джеймс Гулд

(Math.round ((1.015 * 1000) / 10) / 100) .toFixed (2) все ще дає 1,01, чи не має бути 1,02?
gaurav5430

14

toFixed (n) забезпечує n довжину після десяткової точки; toPrecision (x) забезпечує x загальну довжину.

Використовуйте цей метод нижче

// Example: toPrecision(4) when the number has 7 digits (3 before, 4 after)
    // It will round to the tenths place
    num = 500.2349;
    result = num.toPrecision(4); // result will equal 500.2

І якщо ви хочете, щоб номер був фіксованим, використовуйте

result = num.toFixed(2);

це не працює добре ... для числа num = 50.2349 ви повинні написати до точності (3), щоб отримати 50.2
Piotr Czyż

це лише приклад, ви можете змінити його відповідно до ваших потреб @ PiotrCzyż
Syed Umar Ahmed

5

Я не знайшов точного рішення цієї проблеми, тому створив своє:

function inprecise_round(value, decPlaces) {
  return Math.round(value*Math.pow(10,decPlaces))/Math.pow(10,decPlaces);
}

function precise_round(value, decPlaces){
    var val = value * Math.pow(10, decPlaces);
    var fraction = (Math.round((val-parseInt(val))*10)/10);

    //this line is for consistency with .NET Decimal.Round behavior
    // -342.055 => -342.06
    if(fraction == -0.5) fraction = -0.6;

    val = Math.round(parseInt(val) + fraction) / Math.pow(10, decPlaces);
    return val;
}

Приклади:

function inprecise_round(value, decPlaces) {
  return Math.round(value * Math.pow(10, decPlaces)) / Math.pow(10, decPlaces);
}

function precise_round(value, decPlaces) {
  var val = value * Math.pow(10, decPlaces);
  var fraction = (Math.round((val - parseInt(val)) * 10) / 10);

  //this line is for consistency with .NET Decimal.Round behavior
  // -342.055 => -342.06
  if (fraction == -0.5) fraction = -0.6;

  val = Math.round(parseInt(val) + fraction) / Math.pow(10, decPlaces);
  return val;
}

// This may produce different results depending on the browser environment
console.log("342.055.toFixed(2)         :", 342.055.toFixed(2)); // 342.06 on Chrome & IE10

console.log("inprecise_round(342.055, 2):", inprecise_round(342.055, 2)); // 342.05
console.log("precise_round(342.055, 2)  :", precise_round(342.055, 2));   // 342.06
console.log("precise_round(-342.055, 2) :", precise_round(-342.055, 2));  // -342.06

console.log("inprecise_round(0.565, 2)  :", inprecise_round(0.565, 2));   // 0.56
console.log("precise_round(0.565, 2)    :", precise_round(0.565, 2));     // 0.57


2
Дякую. Ось прилад для перевірки цього: jsfiddle.net/lamarant/ySXuF . Я застосовую toFixed () до значення до його повернення, яке додає правильне число нулів до кінця повернутого значення.
ламаран

не працює за значенням = 0,004990845956707237, а точне_мало (значення, 8) повертає 0,00499085, але воно має повернути 0,00499084
MERT DOĞAN,

3

@heridev і я створили невелику функцію в jQuery.

Ви можете спробувати наступне:

HTML

<input type="text" name="one" class="two-digits"><br>
<input type="text" name="two" class="two-digits">​

jQuery

// apply the two-digits behaviour to elements with 'two-digits' as their class
$( function() {
    $('.two-digits').keyup(function(){
        if($(this).val().indexOf('.')!=-1){         
            if($(this).val().split(".")[1].length > 2){                
                if( isNaN( parseFloat( this.value ) ) ) return;
                this.value = parseFloat(this.value).toFixed(2);
            }  
         }            
         return this; //for chaining
    });
});

DEMO ONLINE:

http://jsfiddle.net/c4Wqn/


1
Я можу оцінити внесок, хоча я вважаю, що додавання елементів DOM та jQuery в суміш виходить за межі питання.
Кріс травня

Не слід слухати подію клавіатури, оскільки це виглядає дуже погано і не активується, коли ви додаєте щось із сценарієм. Я б краще послухав inputподію. Це не створює ефект мерехтіння, а також спрацьовує, коли ви звертаєтесь до поля за допомогою JS
Le 'nton

3

Проблема зі значеннями з плаваючою комою полягає в тому, що вони намагаються представляти нескінченну кількість (безперервних) значень з фіксованою кількістю біт. Отже, природно, в грі повинні бути певні втрати, і ви збираєтеся бути покусані якимись значеннями.

Якщо комп’ютер зберігає 1,275 як значення з плаваючою комою, він насправді не пам’ятатиме, був він 1,275 або 1,227499999999999993, або навіть 1,27500000000000002. Ці значення повинні дати різні результати після округлення до двох десяткових знаків, але вони не будуть, оскільки для комп'ютера вони виглядають абсолютно однаково після зберігання як значення з плаваючою комою, і немає можливості відновити втрачені дані. Будь-які подальші розрахунки лише акумулюють таку неточність.

Тож, якщо точність має значення, ви повинні уникати значень з плаваючою комою з самого початку. Найпростіші варіанти - це

  • використовувати виділену бібліотеку
  • використовувати рядки для зберігання та передачі значень (супроводжуються рядковими операціями)
  • використовуйте цілі числа (наприклад, ви можете переходити близько сотих частин фактичної вашої вартості, наприклад, сума в центах замість суми в доларах)

Наприклад, використовуючи цілі числа для зберігання числа сотих, функція пошуку фактичного значення досить проста:

function descale(num, decimals) {
    var hasMinus = num < 0;
    var numString = Math.abs(num).toString();
    var precedingZeroes = '';
    for (var i = numString.length; i <= decimals; i++) {
        precedingZeroes += '0';
    }
    numString = precedingZeroes + numString;
    return (hasMinus ? '-' : '') 
        + numString.substr(0, numString.length-decimals) 
        + '.' 
        + numString.substr(numString.length-decimals);
}

alert(descale(127, 2));

За допомогою рядків вам знадобиться округлення, але це все ще керовано:

function precise_round(num, decimals) {
    var parts = num.split('.');
    var hasMinus = parts.length > 0 && parts[0].length > 0 && parts[0].charAt(0) == '-';
    var integralPart = parts.length == 0 ? '0' : (hasMinus ? parts[0].substr(1) : parts[0]);
    var decimalPart = parts.length > 1 ? parts[1] : '';
    if (decimalPart.length > decimals) {
        var roundOffNumber = decimalPart.charAt(decimals);
        decimalPart = decimalPart.substr(0, decimals);
        if ('56789'.indexOf(roundOffNumber) > -1) {
            var numbers = integralPart + decimalPart;
            var i = numbers.length;
            var trailingZeroes = '';
            var justOneAndTrailingZeroes = true;
            do {
                i--;
                var roundedNumber = '1234567890'.charAt(parseInt(numbers.charAt(i)));
                if (roundedNumber === '0') {
                    trailingZeroes += '0';
                } else {
                    numbers = numbers.substr(0, i) + roundedNumber + trailingZeroes;
                    justOneAndTrailingZeroes = false;
                    break;
                }
            } while (i > 0);
            if (justOneAndTrailingZeroes) {
                numbers = '1' + trailingZeroes;
            }
            integralPart = numbers.substr(0, numbers.length - decimals);
            decimalPart = numbers.substr(numbers.length - decimals);
        }
    } else {
        for (var i = decimalPart.length; i < decimals; i++) {
            decimalPart += '0';
        }
    }
    return (hasMinus ? '-' : '') + integralPart + (decimals > 0 ? '.' + decimalPart : '');
}

alert(precise_round('1.275', 2));
alert(precise_round('1.27499999999999993', 2));

Зауважте, що ця функція закріплюється до найближчого, пов'язаного з нулем , тоді як IEEE 754 рекомендує округлення до найближчого, прив'язується навіть до поведінки за замовчуванням для операцій з плаваючою комою. Такі модифікації залишаються читачем як вправа :)


3

Ось простий

function roundFloat(num,dec){
    var d = 1;
    for (var i=0; i<dec; i++){
        d += "0";
    }
    return Math.round(num * d) / d;
}

Використовуйте як alert(roundFloat(1.79209243929,4));

Jsfiddle


2

Заокруглюйте десяткове значення, а потім використовуйте toFixed(x)для очікуваної цифри.

function parseDecimalRoundAndFixed(num,dec){
  var d =  Math.pow(10,dec);
  return (Math.round(num * d) / d).toFixed(dec);
}

Дзвінок

parseDecimalRoundAndFixed (10.800243929,4) => 10,80 парсеDecimalRoundAndFixed (10.807243929,2) => 10,81


2

Закругніть вниз

function round_down(value, decPlaces) {
    return Math.floor(value * Math.pow(10, decPlaces)) / Math.pow(10, decPlaces);
}

Закруглюємо

function round_up(value, decPlaces) {
    return Math.ceil(value * Math.pow(10, decPlaces)) / Math.pow(10, decPlaces);
}

Круглий найближчий

function round_nearest(value, decPlaces) {
    return Math.round(value * Math.pow(10, decPlaces)) / Math.pow(10, decPlaces);
}

Об’єднані https://stackoverflow.com/a/7641824/1889449 та https://www.kirupa.com/html5/rounding_numbers_in_javascript.htm Дякую їм.


2

/**
 * MidpointRounding away from zero ('arithmetic' rounding)
 * Uses a half-epsilon for correction. (This offsets IEEE-754
 * half-to-even rounding that was applied at the edge cases).
 */

function RoundCorrect(num, precision = 2) {
	// half epsilon to correct edge cases.
	var c = 0.5 * Number.EPSILON * num;
//	var p = Math.pow(10, precision); //slow
	var p = 1; while (precision--> 0) p *= 10;
	if (num < 0)
		p *= -1;
	return Math.round((num + c) * p) / p;
}

// testing some +ve edge cases
console.log(RoundCorrect(1.005, 2));  // 1.01 correct
console.log(RoundCorrect(2.175, 2));  // 2.18 correct
console.log(RoundCorrect(5.015, 2));  // 5.02 correct

// testing some -ve edge cases
console.log(RoundCorrect(-1.005, 2));  // -1.01 correct
console.log(RoundCorrect(-2.175, 2));  // -2.18 correct
console.log(RoundCorrect(-5.015, 2));  // -5.02 correct


2

Ось моє однорядкове рішення: Number((yourNumericValueHere).toFixed(2));

Ось що відбувається:

1) По-перше, ви застосовуєте .toFixed(2)число, яке ви хочете округлити десятковими знаками. Зауважте, що це перетворить значення в рядок з числа. Отже, якщо ви використовуєте Typescript, він видасть помилку на зразок цієї:

"Тип" рядок "не призначається типу" номер ""

2) Щоб повернути числове значення або перетворити рядок у числове значення, просто застосуйте Number()функцію до цього так званого 'рядкового' значення.

Для уточнення дивіться приклад нижче:

ПРИКЛАД: Я маю суму, яка містить до 5 цифр у десяткових знаках, і я хотів би скоротити її до двох знаків після коми. Я це роблю так:

var price = 0.26453;
var priceRounded = Number((price).toFixed(2));
console.log('Original Price: ' + price);
console.log('Price Rounded: ' + priceRounded);


1

Помістіть наступне в деякому глобальному масштабі:

Number.prototype.getDecimals = function ( decDigCount ) {
   return this.toFixed(decDigCount);
}

а потім спробуйте :

var a = 56.23232323;
a.getDecimals(2); // will return 56.23

Оновлення

Зауважте, що toFixed()може працювати лише кількість десяткових знаків між 0-20т. Е. a.getDecimals(25)Може генерувати помилку javascript, так що для розміщення ви можете додати додаткову перевірку, тобто

Number.prototype.getDecimals = function ( decDigCount ) {
   return ( decDigCount > 20 ) ? this : this.toFixed(decDigCount);
}

1
Number(((Math.random() * 100) + 1).toFixed(2))

це поверне випадкове число від 1 до 100 округлених до 2 знаків після коми.



1

Використовуючи цю відповідь за посиланням: https://stackoverflow.com/a/21029698/454827

Я будую функцію для отримання динамічних чисел десяткових знаків:

function toDec(num, dec)
{
        if(typeof dec=='undefined' || dec<0)
                dec = 2;

        var tmp = dec + 1;
        for(var i=1; i<=tmp; i++)
                num = num * 10;

        num = num / 10;
        num = Math.round(num);
        for(var i=1; i<=dec; i++)
                num = num / 10;

        num = num.toFixed(dec);

        return num;
}

ось робочий приклад: https://jsfiddle.net/wpxLduLc/


1

parse = function (data) {
       data = Math.round(data*Math.pow(10,2))/Math.pow(10,2);
       if (data != null) {
            var lastone = data.toString().split('').pop();
            if (lastone != '.') {
                 data = parseFloat(data);
            }
       }
       return data;
  };

$('#result').html(parse(200)); // output 200
$('#result1').html(parse(200.1)); // output 200.1
$('#result2').html(parse(200.10)); // output 200.1
$('#result3').html(parse(200.109)); // output 200.11
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<div id="result"></div>
<div id="result1"></div>
<div id="result2"></div>
<div id="result3"></div>


1

З цими прикладами ви все одно отримаєте помилку при спробі округлити число 1.005, рішення - або використовувати бібліотеку типу Math.js, або цю функцію:

function round(value: number, decimals: number) {
    return Number(Math.round(value + 'e' + decimals) + 'e-' + decimals);
}

1

Я отримав кілька ідей з цього допису кілька місяців тому, але жодна з відповідей тут, ні відповіді з інших дописів / блогів не змогли впоратися з усіма сценаріями (наприклад, негативні номери та деякі "щасливі номери" наш тестер знайшов). Зрештою, наш тестер не знайшов жодної проблеми з цим методом нижче. Вставлення фрагмента мого коду:

fixPrecision: function (value) {
    var me = this,
        nan = isNaN(value),
        precision = me.decimalPrecision;

    if (nan || !value) {
        return nan ? '' : value;
    } else if (!me.allowDecimals || precision <= 0) {
        precision = 0;
    }

    //[1]
    //return parseFloat(Ext.Number.toFixed(parseFloat(value), precision));
    precision = precision || 0;
    var negMultiplier = value < 0 ? -1 : 1;

    //[2]
    var numWithExp = parseFloat(value + "e" + precision);
    var roundedNum = parseFloat(Math.round(Math.abs(numWithExp)) + 'e-' + precision) * negMultiplier;
    return parseFloat(roundedNum.toFixed(precision));
},

У мене також є коментарі до коду (вибачте, що я вже забув усі деталі) ... Я публікую тут свою відповідь для подальшої довідки:

9.995 * 100 = 999.4999999999999
Whereas 9.995e2 = 999.5
This discrepancy causes Math.round(9.995 * 100) = 999 instead of 1000.
Use e notation instead of multiplying /dividing by Math.Pow(10,precision).

0

Я вирішую проблему модифікатора. Підтримка лише 2 десятків.

$(function(){
  //input number only.
  convertNumberFloatZero(22); // output : 22.00
  convertNumberFloatZero(22.5); // output : 22.50
  convertNumberFloatZero(22.55); // output : 22.55
  convertNumberFloatZero(22.556); // output : 22.56
  convertNumberFloatZero(22.555); // output : 22.55
  convertNumberFloatZero(22.5541); // output : 22.54
  convertNumberFloatZero(22222.5541); // output : 22,222.54

  function convertNumberFloatZero(number){
	if(!$.isNumeric(number)){
		return 'NaN';
	}
	var numberFloat = number.toFixed(3);
	var splitNumber = numberFloat.split(".");
	var cNumberFloat = number.toFixed(2);
	var cNsplitNumber = cNumberFloat.split(".");
	var lastChar = splitNumber[1].substr(splitNumber[1].length - 1);
	if(lastChar > 0 && lastChar < 5){
		cNsplitNumber[1]--;
	}
	return Number(splitNumber[0]).toLocaleString('en').concat('.').concat(cNsplitNumber[1]);
  };
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>


0
(Math.round((10.2)*100)/100).toFixed(2)

Це має дати: 10.20

(Math.round((.05)*100)/100).toFixed(2)

Це має дати: 0.05

(Math.round((4.04)*100)/100).toFixed(2)

Це має дати: 4.04

тощо.


0

/*Due to all told stuff. You may do 2 things for different purposes:
When showing/printing stuff use this in your alert/innerHtml= contents:
YourRebelNumber.toFixed(2)*/

var aNumber=9242.16;
var YourRebelNumber=aNumber-9000;
alert(YourRebelNumber);
alert(YourRebelNumber.toFixed(2));

/*and when comparing use:
Number(YourRebelNumber.toFixed(2))*/

if(YourRebelNumber==242.16)alert("Not Rounded");
if(Number(YourRebelNumber.toFixed(2))==242.16)alert("Rounded");

/*Number will behave as you want in that moment. After that, it'll return to its defiance.
*/


0

Це дуже просто і працює так само добре, як і будь-який з інших:

function parseNumber(val, decimalPlaces) {
    if (decimalPlaces == null) decimalPlaces = 0
    var ret = Number(val).toFixed(decimalPlaces)
    return Number(ret)
}

Оскільки toFixed () можна викликати лише на числах, і, на жаль, повертає рядок, це робить весь аналіз для вас в обох напрямках. Ви можете передавати рядок або число, і ви отримуєте номер кожен раз! Виклик parseNumber (1,49) дасть вам 1, а parseNumber (1,49,2) дасть вам 1,50. Так само, як найкращі з них!


0

Ви також можете скористатися .toPrecision()методом і деяким спеціальним кодом, і завжди округляйте до п’ятої десяткової цифри незалежно від довжини внутрішньої частини.

function glbfrmt (number, decimals, seperator) {
    return typeof number !== 'number' ? number : number.toPrecision( number.toString().split(seperator)[0].length + decimals);
}

Ви також можете зробити плагін для кращого використання.



-2

Я знайшов дуже простий спосіб, який вирішив цю проблему для мене і може бути використаний або адаптований:

td[row].innerHTML = price.toPrecision(price.toFixed(decimals).length

-4

100% працює !!! Спробуй це

<html>
     <head>
      <script>
      function replacePonto(){
        var input = document.getElementById('qtd');
        var ponto = input.value.split('.').length;
        var slash = input.value.split('-').length;
        if (ponto > 2)
                input.value=input.value.substr(0,(input.value.length)-1);

        if(slash > 2)
                input.value=input.value.substr(0,(input.value.length)-1);

        input.value=input.value.replace(/[^0-9.-]/,'');

        if (ponto ==2)
	input.value=input.value.substr(0,(input.value.indexOf('.')+3));

if(input.value == '.')
	input.value = "";
              }
      </script>
      </head>
      <body>
         <input type="text" id="qtd" maxlength="10" style="width:140px" onkeyup="return replacePonto()">
      </body>
    </html>


Ласкаво просимо до SO. Прочитайте, як відповісти, і дотримуйтесь інструкцій щодо відповіді.
thewaywewere
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.