Bagaimana Anda membulatkan ke 1 tempat desimal di Javascript?


Jawaban:


729

Math.round(num * 10) / 10 berfungsi, berikut adalah contohnya ...

var number = 12.3456789
var rounded = Math.round(number * 10) / 10
// rounded is 12.3

jika Anda ingin memiliki satu tempat desimal, bahkan ketika itu akan menjadi 0, maka tambahkan ...

var fixed = rounded.toFixed(1)
// fixed is always to 1 d.p.
// NOTE: .toFixed() returns a string!

// To convert back to number format
parseFloat(number.toFixed(2))
// 12.34
// but that will not retain any trailing zeros

// So, just make sure it is the last step before output,
// and use a number format during calculations!

EDIT: Tambahkan putaran dengan fungsi presisi ...

Menggunakan prinsip ini, untuk referensi, berikut adalah fungsi bundar kecil praktis yang membutuhkan ketelitian ...

function round(value, precision) {
    var multiplier = Math.pow(10, precision || 0);
    return Math.round(value * multiplier) / multiplier;
}

... penggunaan ...

round(12345.6789, 2) // 12345.68
round(12345.6789, 1) // 12345.7

... default untuk membulatkan ke bilangan bulat terdekat (presisi 0) ...

round(12345.6789) // 12346

... dan dapat digunakan untuk membulatkan ke 10 atau 100 dll terdekat ...

round(12345.6789, -1) // 12350
round(12345.6789, -2) // 12300

... dan penanganan yang benar dari angka negatif ...

round(-123.45, 1) // -123.4
round(123.45, 1) // 123.5

... dan dapat dikombinasikan dengan toFixed untuk memformat secara konsisten sebagai string ...

round(456.7, 2).toFixed(2) // "456.70"

45
Hati-hati menggunakan .toFixed()karena mengembalikan string ketika Anda mungkin menginginkan nomor.
Cobby

1
Keren, jelas menggunakan parseFloatakan menghapus desimal yang tersisa .toFixed()jika itu bilangan bulat (nol). Secara umum, jika Anda ingin menghitung, yang terbaik adalah mengikuti contoh pertama Anda. Jika Anda ingin menampilkan nomor di UI Anda, gunakan .toFixed().
Cobby

Hmmm ... itu masuk akal, cara apa pun yang Anda konversi ke angka harus selalu menghapus nol yang salah, itulah sebabnya ia harus tetap menjadi string. Saya kira itu harus selalu menjadi langkah terakhir sebelum tampilan, dan tidak digunakan dalam perhitungan.
Billy Moon

2
Hati-hati menggunakan .toFixed()karena dapat mengembalikan hasil pembulatan yang berbeda untuk browser yang berbeda. Baca posting ini untuk detail tentang topik ini!
Wilt

1
Bisakah saya menambahkan nol jika tidak ada DP?
Nick

102
var number = 123.456;

console.log(number.toFixed(1)); // should round to 123.5

4
Terkadang toFixed()ada gangguan - Saya telah melihatnya di browser Chrome tempat saya menelepon toFixed(), lalu mengonversi ke string, dan itu menunjukkan sesuatu seperti 10.00000000068- aneh. Tidak dapat mereproduksi ini dengan andal.
Hamish Grubijan

Ya, saya bertanggung jawab terhadap gangguan toFixed () bahkan hanya dengan beberapa desimal. Itu membulatkan pecahan 4 ke angka berikutnya yang lebih tinggi, bukan yang lebih rendah, jika saya ingat dengan benar.
Dalibor

1
seperti yang disebutkan oleh @cobby di atas: hati-hati menggunakan .toFixed()karena mengembalikan Stringketika Anda mungkin menginginkanNumber
Ricardo

28

Jika Anda menggunakan Math.round(5.01)Anda akan mendapatkan 5bukan 5.0.

Jika Anda menggunakan toFixedAnda mengalami masalah pembulatan .

Jika Anda menginginkan yang terbaik dari kedua dunia, kombinasikan keduanya:

(Math.round(5.01 * 10) / 10).toFixed(1)

Anda mungkin ingin membuat fungsi untuk ini:

function roundedToFixed(_float, _digits){
  var rounded = Math.pow(10, _digits);
  return (Math.round(_float * rounded) / rounded).toFixed(_digits);
}

Mengapa garis bawah untuk params yaitu (_float, _digits)? Jangan ragu untuk hanya mengirim tautan di mana saya dapat menemukan jawabannya sendiri Terima kasih
Shark Lasers


11

Saya memilih toFixed(), tetapi, untuk catatan, inilah cara lain yang menggunakan sedikit pergeseran untuk melemparkan nomor ke int. Jadi, selalu membulatkan ke nol (turun untuk angka positif, naik untuk negatif).

var rounded = ((num * 10) << 0) * 0.1;

Tapi hei, karena tidak ada panggilan fungsi, itu cepat jahat. :)

Dan inilah yang menggunakan pencocokan string:

var rounded = (num + '').replace(/(^.*?\d+)(\.\d)?.*/, '$1$2');

Saya tidak merekomendasikan menggunakan varian string, katakan saja.


7

Coba dengan ini:

var original=28.453

// 1.- round "original" to two decimals
var result = Math.round (original * 100) / 100  //returns 28.45

// 2.- round "original" to 1 decimal
var result = Math.round (original * 10) / 10  //returns 28.5

// 3.- round 8.111111 to 3 decimals
var result = Math.round (8.111111 * 1000) / 1000  //returns 8.111

kurang rumit dan lebih mudah diimplementasikan ...

dengan ini, Anda dapat membuat fungsi untuk dilakukan:

function RoundAndFix (n, d) {
    var m = Math.pow (10, d);
    return Math.round (n * m) / m;
}

EDIT : lihat ini Cara membulatkan menggunakan ROUND HALF UP. Mode pembulatan yang sebagian besar dari kita diajarkan di sekolah dasar


Tidak: RoundAndFix (1,005, 2).
Noyo

4

x = angka, n = tempat desimal:

function round(x, n) {
    return Math.round(x * Math.pow(10, n)) / Math.pow(10, n)
}

Tidak: bulat (1,005, 2).
Noyo

4

Kenapa tidak adil?

let myNumber = 213.27321;
+myNumber.toFixed(1); // => 213.3
  1. toFixed : mengembalikan string yang mewakili nomor yang diberikan menggunakan notasi titik tetap.
  2. Unary plus (+) : Operator unary plus mendahului operandnya dan mengevaluasi operandnya tetapi mencoba mengubahnya menjadi angka, jika belum.

3
var num = 34.7654;

num = Math.round(num * 10) / 10;

console.log(num); // Logs: 34.8

3

Untuk melengkapi Jawaban Terbaik:

var round = function ( number, precision )
{
    precision = precision || 0;
    return parseFloat( parseFloat( number ).toFixed( precision ) );
}

Nomor parameter input mungkin "tidak" selalu berupa angka, dalam hal ini .toFixed tidak ada.


3

ES 6 Versi dari Jawaban yang Diterima:

function round(value, precision) {
    const multiplier = 10 ** (precision || 0);
    return Math.round(value * multiplier) / multiplier;
}

3

Menggunakan metode toPrecision:

var a = 1.2345
a.toPrecision(2)

// result "1.2"

Sejauh ini jawaban terbaik yang pernah saya coba. Terima kasih.
Ste

Tetapi Anda harus berhati-hati karena 12.345.toPrecision( 2 )itu "12".
Joshua Pinter

2

Jika metode Anda tidak berhasil, harap kirim kode Anda.

Namun, Anda bisa menyelesaikan tugas pembulatan sebagai:

var value = Math.round(234.567*100)/100

Akan memberimu 234.56

Demikian pula

 var value = Math.round(234.567*10)/10

Akan memberi 234.5

Dengan cara ini Anda bisa menggunakan variabel menggantikan konstanta seperti yang digunakan di atas.


1

Filter Little Angular jika ada yang menginginkannya:

angular.module('filters').filter('decimalPlace', function() {
    return function(num, precision) {
        var multiplier = Math.pow(10, precision || 0);
        return Math.round(num * multiplier) / multiplier;
    };
});

gunakan jika melalui:

{{model.value| decimalPlace}}
{{model.value| decimalPlace:1}}
{{model.value| decimalPlace:2}}

:)


1

Secara umum, pembulatan dilakukan dengan penskalaan: round(num / p) * p

Menggunakan notasi eksponensial menangani pembulatan + ve angka, dengan benar. Namun, metode ini gagal membulatkan tepi-kasus dengan benar.

function round(num, precision = 2) {
	var scaled = Math.round(num + "e" + precision);
	return Number(scaled + "e" + -precision);
}

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

console.log( round(-1.005, 2) );  // -1    wrong
console.log( round(-2.175, 2) );  // -2.17 wrong
console.log( round(-5.015, 2) );  // -5.01 wrong

Di sini, juga merupakan salah satu fungsi yang saya tulis untuk melakukan pembulatan aritmatika, Anda dapat mengujinya sendiri.

/**
 * 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 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

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


0

Ini tampaknya bekerja dengan andal di semua yang saya lemparkan:

function round(val, multiplesOf) {
  var s = 1 / multiplesOf;
  var res = Math.ceil(val*s)/s;
  res = res < val ? res + multiplesOf: res;
  var afterZero = multiplesOf.toString().split(".")[1];
  return parseFloat(res.toFixed(afterZero ? afterZero.length : 0));
}

Itu bulat, jadi Anda mungkin perlu memodifikasinya sesuai dengan kasus penggunaan. Ini seharusnya bekerja:

console.log(round(10.01, 1)); //outputs 11
console.log(round(10.01, 0.1)); //outputs 10.1

0

Jika Anda peduli tentang pembulatan yang tepat maka:

function roundNumericStrings(str , numOfDecPlacesRequired){ 
     var roundFactor = Math.pow(10, numOfDecPlacesRequired);  
     return (Math.round(parseFloat(str)*roundFactor)/roundFactor).toString();  }

Jika tidak, maka Anda sudah mendapat balasan dari posting sebelumnya

str.slice(0, -1)

0

Math.round( num * 10) / 10 tidak bekerja

Misalnya, 1455581777.8-145558160.4memberi Anda1310023617.3999999 .

Jadi hanya gunakan num.toFixed(1)


0

Saya membuat satu yang mengembalikan tipe angka dan juga menempatkan desimal hanya jika diperlukan (no 0 padding).

Contoh:

roundWithMaxPrecision(11.234, 2); //11.23
roundWithMaxPrecision(11.234, 1); //11.2
roundWithMaxPrecision(11.234, 4); //11.23
roundWithMaxPrecision(11.234, -1); //10

roundWithMaxPrecision(4.2, 2); //4.2
roundWithMaxPrecision(4.88, 1); //4.9

Kode:

function roundWithMaxPrecision (n, precision) {
    return Math.round(n * Math.pow(10, precision)) / Math.pow(10, precision);
}

0

Saya menemukan cara untuk menghindari masalah presisi:

function badRound (num, precision) {
    const x = 10 ** precision;
    return Math.round(num * x) / x
}
// badRound(1.005, 2) --> 1

function round (num, precision) {
    const x = 10 ** (precision + 1);
    const y = 10 ** precision;
    return Math.round(Math.round(num * x) / 10) / y
}
// round(1.005, 2) --> 1.01

0
Math.round( mul/count * 10 ) / 10

Math.round(Math.sqrt(sqD/y) * 10 ) / 10

Terima kasih

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.