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?

Johnydep
sumber

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;
}
newtron
sumber
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

Kesepakatan Michael
sumber
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

Ronan Stoffers
sumber
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;
}
Julia Savinkova
sumber
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;
Paul Lee
sumber
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;)

mekdigital
sumber
0
var f = 2.6;
var v = Math.floor(f) + ( Math.round( (f - Math.floor(f)) ) ? 0.5 : 0.0 );
Api
sumber
3
jika f = 1.9, ini akan menghasilkan v = 1, yang salah.
bogatyrjov