Pertanyaan Membulatkan maksimal 2 desimal (hanya jika perlu)


Saya ingin membulatkan maksimal 2 desimal, tapi hanya jika perlu.

Memasukkan:

10
1.7777777
9.1

Keluaran:

10
1.78
9.1

Bagaimana saya bisa melakukan ini JavaScript?


1835
2017-08-06 17:17


asal


Jawaban:


Menggunakan Math.round(num * 100) / 100


2280
2017-08-06 17:20



Jika nilainya adalah jenis teks:

parseFloat("123.456").toFixed(2);

Jika nilainya berupa angka:

var numb = 123.23454;
numb = numb.toFixed(2);

Ada kerugian yang nilai-nilai seperti 1,5 akan memberikan "1,50" sebagai output. Perbaikan yang disarankan oleh @minitech:

var numb = 1.5;
numb = +numb.toFixed(2);
// Note the plus sign that drops any "extra" zeroes at the end.
// It changes the result (which is a string) into a number again (think "0 + foo"),
// which means that it uses only as many digits as necessary.

Sepertinya Math.round adalah solusi yang lebih baik. Tapi ternyata tidak! Dalam beberapa kasus itu akan terjadi TIDAK putaran dengan benar:

Math.round(1.005 * 1000)/1000 // Returns 1 instead of expected 1.01!

toFixed () juga akan TIDAK membulat dengan benar dalam beberapa kasus (diuji di Chrome v.55.0.2883.87)!

Contoh:

parseFloat("1.555").toFixed(2); // Returns 1.55 instead of 1.56.
parseFloat("1.5550").toFixed(2); // Returns 1.55 instead of 1.56.
// However, it will return correct result if you round 1.5551.
parseFloat("1.5551").toFixed(2); // Returns 1.56 as expected.

1.3555.toFixed(3) // Returns 1.355 instead of expected 1.356.
// However, it will return correct result if you round 1.35551.
1.35551.toFixed(2); // Returns 1.36 as expected.

Saya kira, ini karena 1.555 sebenarnya sesuatu seperti float 1.55499994 di belakang layar.

Solusi 1 adalah menggunakan skrip dengan algoritma pembulatan yang diperlukan, misalnya:

function roundNumber(num, scale) {
  if(!("" + num).includes("e")) {
    return +(Math.round(num + "e+" + scale)  + "e-" + scale);
  } else {
    var arr = ("" + num).split("e");
    var sig = ""
    if(+arr[1] + scale > 0) {
      sig = "+";
    }
    return +(Math.round(+arr[0] + "e" + sig + (+arr[1] + scale)) + "e-" + scale);
  }
}

https://plnkr.co/edit/uau8BlS1cqbvWPCHJeOy?p=preview

Solusi 2 adalah untuk menghindari kalkulasi front end dan tarik nilai bulat dari server backend.


2319
2017-10-11 00:27



Kamu dapat memakai

function roundToTwo(num) {    
    return +(Math.round(num + "e+2")  + "e-2");
}

Saya menemukan ini di atas MDN. Cara mereka menghindari masalah dengan 1,005 itu tersebut.

roundToTwo(1.005)
1.01
roundToTwo(10)
10
roundToTwo(1.7777777)
1.78
roundToTwo(9.1)
9.1
roundToTwo(1234.5678)
1234.57

323
2017-08-21 12:56



Jawaban MarkG adalah yang benar. Ini adalah ekstensi umum untuk sejumlah tempat desimal.

Number.prototype.round = function(places) {
  return +(Math.round(this + "e+" + places)  + "e-" + places);
}

Pemakaian:

var n = 1.7777;    
n.round(2); // 1.78

Tes unit:

it.only('should round floats to 2 places', function() {

  var cases = [
    { n: 10,      e: 10,    p:2 },
    { n: 1.7777,  e: 1.78,  p:2 },
    { n: 1.005,   e: 1.01,  p:2 },
    { n: 1.005,   e: 1,     p:0 },
    { n: 1.77777, e: 1.8,   p:1 }
  ]

  cases.forEach(function(testCase) {
    var r = testCase.n.round(testCase.p);
    assert.equal(r, testCase.e, 'didn\'t get right number');
  });
})

115
2017-11-01 07:40



Yang bisa digunakan .toFixed(NumberOfDecimalPlaces).

var str = 10.234.toFixed(2); // => '10.23'
var number = Number(str); // => 10.23

69
2017-10-21 17:02



Metode pembulatan yang tepat. Sumber: Mozilla

(function(){

    /**
     * Decimal adjustment of a number.
     *
     * @param   {String}    type    The type of adjustment.
     * @param   {Number}    value   The number.
     * @param   {Integer}   exp     The exponent (the 10 logarithm of the adjustment base).
     * @returns {Number}            The adjusted value.
     */
    function decimalAdjust(type, value, exp) {
        // If the exp is undefined or zero...
        if (typeof exp === 'undefined' || +exp === 0) {
            return Math[type](value);
        }
        value = +value;
        exp = +exp;
        // If the value is not a number or the exp is not an integer...
        if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0)) {
            return NaN;
        }
        // Shift
        value = value.toString().split('e');
        value = Math[type](+(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));
    }

    // Decimal round
    if (!Math.round10) {
        Math.round10 = function(value, exp) {
            return decimalAdjust('round', value, exp);
        };
    }
    // Decimal floor
    if (!Math.floor10) {
        Math.floor10 = function(value, exp) {
            return decimalAdjust('floor', value, exp);
        };
    }
    // Decimal ceil
    if (!Math.ceil10) {
        Math.ceil10 = function(value, exp) {
            return decimalAdjust('ceil', value, exp);
        };
    }
})();

Contoh:

// Round
Math.round10(55.55, -1); // 55.6
Math.round10(55.549, -1); // 55.5
Math.round10(55, 1); // 60
Math.round10(54.9, 1); // 50
Math.round10(-55.55, -1); // -55.5
Math.round10(-55.551, -1); // -55.6
Math.round10(-55, 1); // -50
Math.round10(-55.1, 1); // -60
Math.round10(1.005, -2); // 1.01 -- compare this with Math.round(1.005*100)/100 above
// Floor
Math.floor10(55.59, -1); // 55.5
Math.floor10(59, 1); // 50
Math.floor10(-55.51, -1); // -55.6
Math.floor10(-51, 1); // -60
// Ceil
Math.ceil10(55.51, -1); // 55.6
Math.ceil10(51, 1); // 60
Math.ceil10(-55.59, -1); // -55.5
Math.ceil10(-59, 1); // -50

54
2017-08-01 08:02



Tak satu pun dari jawaban yang ditemukan di sini benar. @stinkycheeseman diminta untuk pembulatan, Anda semua membulatkan angka.

Untuk mengumpulkan, gunakan ini:

Math.ceil(num * 100)/100;

53
2018-06-13 09:35