Làm thế nào để làm tròn số trong Javascript?


159

Tôi muốn sử dụng Javascript để làm tròn số. Vì số là tiền tệ, tôi muốn nó làm tròn như trong các ví dụ này (2 điểm thập phân):

  • 192.168 => 192.20
  • 192.11 => 192.20
  • 192,21 => 192,30
  • 192,26 => 192,30
  • 192,20 => 192,20

Làm thế nào để đạt được điều này bằng Javascript? Hàm Javascript tích hợp sẽ làm tròn số dựa trên logic tiêu chuẩn (ít hơn và nhiều hơn 5 để làm tròn).

Câu trả lời:


313
/**
 * @param num The number to round
 * @param precision The number of decimal places to preserve
 */
function roundUp(num, precision) {
  precision = Math.pow(10, precision)
  return Math.ceil(num * precision) / precision
}

roundUp(192.168, 1) //=> 192.2

2
@AndrewMarshall mục đích của phép nhân, sau đó chia cho 10 là gì?
codecowboy

6
@codecowboy Nếu bạn không, sau đó ceil()sẽ cung cấp cho bạn 193, vì vậy chúng tôi phải đảm bảo rằng tất cả độ chính xác mà chúng tôi muốn giữ là trước dấu thập phân. Sau đó, chúng tôi thực hiện thao tác nghịch đảo để khôi phục giá trị gốc của bản gốc.
Andrew Marshall

1
Nếu bạn nhận được một số như thế 192.19999999999997, bạn có thể đăng ký .toFixed(1)vàonum
flamer.ohr

4
Và đối với những người ở đây tự hỏi làm thế nào để làm tròn số WHOLE gần nhất, bạn chỉ cần Math.ceil (). Phần còn lại chỉ là để đối phó với số thập phân. Để tiết kiệm thời gian cho người khác, tôi phải mất thời gian để làm điều đó!
Nigel B. Peck

Giải pháp này có lỗi: Math.ceil (0,0159 * 1000000000) / độ chính xác. Bạn sẽ nhận được một phần 0,015900001. Cần thêm một xác nhận phạm vi cho chính xác.
Frank

26

Hơi muộn nhưng, có thể tạo ra một chức năng javascript có thể sử dụng lại cho mục đích này:

// Arguments: number to round, number of decimal places
function roundNumber(rnum, rlength) { 
    var newnumber = Math.round(rnum * Math.pow(10, rlength)) / Math.pow(10, rlength);
    return newnumber;
}

Gọi hàm là

alert(roundNumber(192.168,2));

2
Điều này hoạt động rất tốt, nhưng OP đã hỏi cách làm tròn số, vì vậy Math.ceil nên được sử dụng ở đây thay vì Math.round.
kloddant

Câu trả lời này tốt hơn câu trả lời được chấp nhận nếu bạn đang tìm cách làm tròn đúng cho dù bạn đang nhắm đến vị trí thập phân nào. Ví dụ: 1.054 -> 1.05 1.055 -> 1.06 TUY NHIÊN ở đây là trường hợp cạnh: 1.005 -> 1 1.006 -> 1.01 VÀ 1.015 -> 1.01 1.016 -> 1.02 Vì vậy, hãy cẩn thận.
Jay K

21

Làm tròn bình thường sẽ hoạt động với một tinh chỉnh nhỏ:

Math.round(price * 10)/10

và nếu bạn muốn giữ định dạng tiền tệ, bạn có thể sử dụng phương thức Số .toFixed()

(Math.round(price * 10)/10).toFixed(2)

Mặc dù điều này sẽ làm cho nó thành Chuỗi =)


Math.round (192.11 * 100) / 100 -> 192.11
krtek

1
Người thứ hai không cần làm tròn, giống nhưprice.toFixed(2)
Michael Krelin - hacker

@Krtek ooops, Cảm ơn bạn đã nắm bắt điều đó. Tôi đọc sai câu hỏi. Trả lời cập nhật.
Shad

2
OP đã hỏi cách làm tròn số, vì vậy Math.ceil nên được sử dụng ở đây thay vì Math.round.
kloddant

10

Rất gần với câu trả lời của TheEye , nhưng tôi thay đổi một điều nhỏ để làm cho nó hoạt động:

var num = 192.16;
    
console.log(    Math.ceil(num * 10) / 10    );


2

OP mong đợi hai điều:
A. làm tròn lên phần mười cao hơn và
B. hiển thị số 0 ở vị trí thứ một trăm (một nhu cầu điển hình với tiền tệ).

Đáp ứng cả hai yêu cầu dường như cần một phương pháp riêng cho từng điều trên. Đây là một cách tiếp cận dựa trên câu trả lời được đề xuất của suryakiran:

//Arguments: number to round, number of decimal places.

function roundPrice(rnum, rlength) {
    var newnumber = Math.ceil(rnum * Math.pow(10, rlength-1)) / Math.pow(10, rlength-1);
    var toTenths = newnumber.toFixed(rlength);
    return toTenths;
}

alert(roundPrice(678.91011,2)); // returns 679.00
alert(roundPrice(876.54321,2)); // returns 876.60

Lưu ý quan trọng: giải pháp này tạo ra một kết quả rất khác với số âm và số mũ.

Để so sánh giữa câu trả lời này và hai câu hỏi rất giống nhau, hãy xem 2 cách tiếp cận sau đây. Cái đầu tiên chỉ đơn giản là làm tròn đến một phần trăm gần nhất mỗi thông thường, và cái thứ hai chỉ đơn giản là làm tròn đến một phần trăm gần nhất (lớn hơn).

function roundNumber(rnum, rlength) { 
    var newnumber = Math.round(rnum * Math.pow(10, rlength)) / Math.pow(10, rlength);
    return newnumber;
}

alert(roundNumber(678.91011,2)); // returns 678.91

function ceilNumber(rnum, rlength) { 
    var newnumber = Math.ceil(rnum * Math.pow(10, rlength)) / Math.pow(10, rlength);
    return newnumber;
}

alert(ceilNumber(678.91011,2)); // returns 678.92

2

ok, điều này đã được trả lời, nhưng tôi nghĩ bạn có thể muốn xem câu trả lời của tôi gọi hàm math.pow () một lần. Tôi đoán tôi thích giữ những thứ KHÔ.

function roundIt(num, precision) {
    var rounder = Math.pow(10, precision);
    return (Math.round(num * rounder) / rounder).toFixed(precision)
};

Nó là loại đặt tất cả cùng nhau. Thay thế Math.round () bằng Math.ceil () thành làm tròn thay vì làm tròn, đó là điều OP muốn.


1

Hàm này giới hạn số thập phân không có số tròn

function limitDecimal(num,decimal){
     return num.toString().substring(0, num.toString().indexOf('.')) + (num.toString().substr(num.toString().indexOf('.'), decimal+1));
}

Thay thế ngắn hơn: return ('' + num) .split ('.'). Shift ()
Roberto

cảm ơn Roberto mã này hoạt động, nhưng xóa tất cả số thập phân
Behnam Mohammadi

0

Tôi đã sử dụng câu trả lời @AndrewMarshall trong một thời gian dài, nhưng tìm thấy một số trường hợp cạnh. Các xét nghiệm sau không vượt qua:

equals(roundUp(9.69545, 4), 9.6955);
equals(roundUp(37.760000000000005, 4), 37.76);
equals(roundUp(5.83333333, 4), 5.8333);

Đây là những gì tôi sử dụng để làm tròn chính xác:

// Closure
(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;
    }
    // If the value is negative...
    if (value < 0) {
      return -decimalAdjust(type, -value, exp);
    }
    // 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);
    };
  }
})();

// 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
Math.round10(-1.005, -2);  // -1.01
// 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

Nguồn: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round


1
Trường hợp thử nghiệm của bạn có vẻ không chính xác. roundUp(37.760000000000005, 4)nên 37.7601, và roundUp(5.83333333, 4)nên có 5.8334. Cả hai (và đầu tiên của bạn) đều đúng với fn tôi cung cấp.
Andrew Marshall

@AndrewMarshall có lý do, giá trị dự kiến ​​của bạn sai cho trường hợp 2 và 3.
Amn

-3

parseInt luôn làm tròn xuống soo .....

console.log(parseInt(5.8)+1);

làm parseInt () + 1

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.