Số làm tròn của Javascript đến 0,5 gần nhất


96


Ai đó có thể cho tôi một ý tưởng làm thế nào tôi có thể làm tròn một số chính xác đến 0,5 không.
Tôi phải chia tỷ lệ các phần tử trong trang web theo độ phân giải màn hình và vì điều đó, tôi chỉ có thể chỉ định kích thước phông chữ theo pts thành 1, 1,5 hoặc 2 trở đi, v.v.

Nếu tôi làm tròn nó sẽ làm tròn đến 1 chữ số thập phân hoặc không. Làm thế nào tôi có thể hoàn thành công việc này?

Câu trả lời:


187

Viết hàm của riêng bạn nhân với 2, làm tròn, sau đó chia cho 2, ví dụ

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

Chỉ cần sử dụng điều này để làm sạch một hàm giảm trên các giá trị tiền tệ quay trở lại với như 9 dấu thập phân ... (num * 100) / 100 hoạt động hoàn hảo.
Dustin Kreidler

Nếu bạn muốn kết thúc bằng 13.0 hoặc 13.5, tôi đã kết hợp câu trả lời của bạn với câu dưới đây: function roundHalf (num) {return (Math.round (num * 2) / 2) .toFixed (1); }
Dan D

làm tròn số * 2 không hoạt động cho tất cả các trường hợp. Hãy thử bất kỳ số thập phân nào như 15,27 => sử dụng công thức của bạn sẽ cho ra => 15 trong đó thực tế nó phải trả về 15,5. **** Tôi nghĩ sử dụng toFixed sẽ tốt hơn (num * 2) .toFixed () / 2
sfdx bomb

@sfdxbomb Bạn đã kiểm tra cái này chưa? Trong bảng điều khiển của trình duyệt của tôi roundHalf(15.27)trả về 15,5
malarres

81

Đây là một giải pháp chung chung hơn có thể hữu ích cho bạn:

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
Nghĩa invlà gì? Có gì các invbiến đại diện?
Deilan

1
@Deilan, tôi đoán inverse.
Alex K

2

Math.round(-0.5)trả về 0 , nhưng nó phải là -1 theo các quy tắc toán học.

Thông tin thêm: Math.round ()Number.prototype.toFixed ()

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

1
@Yuri Để mở rộng những gì bạn đang nói, hãy làm roundtròn đến số nguyên tiếp theo lớn hơn giá trị đã cho, về mặt số âm sẽ hướng tới phổ số nguyên dương. -2,5 sẽ chuyển thành -2. Đúng không?
Danny Bullis

Yup vừa được xác minh. Math.ceil(-1.75) == -1Math.floor(-1.75) == -2. Vì vậy, đối với bất kỳ ai gặp phải vấn đề này, chỉ cần nghĩ về nó như ceiltrả về một số lớn hơn , floortrả về một số nhỏ hơn .
Danny Bullis

2

Để mở rộng câu trả lời hàng đầu của newtron để làm tròn chỉ hơn 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


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
    }

Tôi đã viết điều này trước khi thấy phản ứng tốt hơn của Tunaki;)


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

3
nếu f = 1.9, điều này sẽ dẫn đến v = 1, điều này không chính xác.
bogatyrjov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.