Angka pembulatan JavaScript ke 0,5 terdekat


100


Adakah yang bisa memberi saya gambaran bagaimana saya bisa membulatkan angka ke 0,5 terdekat.
Saya harus menskalakan elemen di halaman web sesuai dengan resolusi layar dan untuk itu saya hanya dapat menetapkan ukuran font dalam poin ke 1, 1.5 atau 2 dan seterusnya, dll.

Jika saya membulatkannya menjadi 1 tempat desimal atau tidak ada. Bagaimana saya bisa menyelesaikan pekerjaan ini?

Jawaban:


194

Tulis fungsi Anda sendiri yang dikalikan dengan 2, pembulatan, kemudian bagi dengan 2, misalnya

function roundHalf(num) {
    return Math.round(num*2)/2;
}

Baru saja menggunakan ini untuk membersihkan fungsi pengurangan pada nilai moneter yang kembali dengan 9 titik desimal ... (num * 100) / 100 bekerja dengan sempurna.
Dustin Kreidler

Jika Anda ingin mendapatkan 13.0 atau 13.5, saya menggabungkan jawaban Anda dengan yang di bawah ini: function roundHalf (num) {return (Math.round (num * 2) / 2) .toFixed (1); }
Dan D

membulatkan angka * 2 tidak berlaku untuk semua kasus .. coba desimal apa pun seperti 15.27 => menggunakan rumus Anda akan menghasilkan => 15 di mana sebenarnya seharusnya mengembalikan 15.5. **** Saya pikir menggunakan toFixed akan lebih baik (num * 2) .toFixed () / 2
bom sfdx

@sfdxbomb Sudahkah Anda memeriksa ini? Di konsol browser saya roundHalf(15.27)mengembalikan 15,5
malarres

83

Berikut solusi yang lebih umum yang mungkin berguna bagi Anda:

function round(value, step) {
    step || (step = 1.0);
    var inv = 1.0 / step;
    return Math.round(value * inv) / inv;
}

round(2.74, 0.1) = 2.7

round(2.74, 0.25) = 2.75

round(2.74, 0.5) = 2.5

round(2.74, 1.0) = 3,0


1
Apa invmaksudnya Apa yang invdiwakili oleh variabel?
Deilan

1
@Deilan kurasa inverse.
Alex K

3

Untuk memperluas jawaban teratas dengan newtron untuk pembulatan lebih dari 0,5

function roundByNum(num, rounder) {
    var multiplier = 1/(rounder||0.5);
    return Math.round(num*multiplier)/multiplier;
}

console.log(roundByNum(74.67)); //expected output 74.5
console.log(roundByNum(74.67, 0.25)); //expected output 74.75
console.log(roundByNum(74.67, 4)); //expected output 76


2

Math.round(-0.5)mengembalikan 0 , tetapi harus -1 sesuai dengan aturan matematika.

Info selengkapnya : Math.round () dan Number.prototype.toFixed ()

function round(number) {
    var value = (number * 2).toFixed() / 2;
    return value;
}

1
@Yuri Untuk memperluas apa yang Anda katakan, bulatkan roundke bilangan bulat berikutnya lebih besar dari nilai yang diberikan, yang dalam hal bilangan negatif akan mengarah ke spektrum bilangan bulat positif. -2,5 akan menjadi -2. Apakah itu benar?
Danny Bullis

Yup baru saja diverifikasi. Math.ceil(-1.75) == -1dan Math.floor(-1.75) == -2. Jadi bagi siapa pun yang tersandung oleh ini, anggap saja sebagai ceilpengembalian yang lebih besar dari angka, floormengembalikan kurang dari angka.
Danny Bullis

2

Hanya versi yang dipreteli dari semua jawaban di atas:

Math.round(valueToRound / 0.5) * 0.5;

Umum:

Math.round(valueToRound / step) * step;

1
    function roundToTheHalfDollar(inputValue){
      var percentile = Math.round((Math.round(inputValue*Math.pow(10,2))/Math.pow(10,2)-parseFloat(Math.trunc(inputValue)))*100)
      var outputValue = (0.5 * (percentile >= 25 ? 1 : 0)) + (0.5 * (percentile >= 75 ? 1 : 0))
      return Math.trunc(inputValue) + outputValue
    }

Saya menulis ini sebelum melihat respon Tunaki yang lebih baik;)


0
var f = 2.6;
var v = Math.floor(f) + ( Math.round( (f - Math.floor(f)) ) ? 0.5 : 0.0 );

3
jika f = 1.9, ini akan menghasilkan v = 1, yang salah.
bogatyrjov
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.