Ví dụ
Đặt x = math.Round [2.5];
Hãy tự mình thử »
Đặt a = math.Round [2.60]; Đặt b = math.Round [2.50]; Đặt c = math.Round [2.49]; Đặt d = math.Round [-2.60]; Đặt e = math.Round [-2,50]; Đặt f = math.Round [-2,49];
let b = Math.round[2.50];
let c = Math.round[2.49];
let d = Math.round[-2.60];
let e = Math.round[-2.50];
let f = Math.round[-2.49];
Hãy tự mình thử »
Đặt a = math.Round [2.60]; Đặt b = math.Round [2.50]; Đặt c = math.Round [2.49]; Đặt d = math.Round [-2.60]; Đặt e = math.Round [-2,50]; Đặt f = math.Round [-2,49];
Định nghĩa và cách sử dụng
Phương thức
console.log[Math.round[32.65]];
console.log[Math.round[8.1]];
console.log[Math.round[-4.2]];
5 làm tròn một số vào số nguyên gần nhất.2,49 sẽ được làm tròn xuống [2] và 2,5 sẽ được làm tròn [3].
Cú pháp
Thông số | Tham số |
Sự mô tả | x A number. |
Cần thiết.a số.
Giá trị trả về | Tham số |
Sự mô tả | x |
Cần thiết.a số.
Giá trị trả về
Loại hình
Con số | Số được làm tròn đến số nguyên gần nhất. | Hỗ trợ trình duyệt | 5 là tính năng ECMAScript1 [ES1]. | ES1 [JavaScript 1997] được hỗ trợ đầy đủ trong tất cả các trình duyệt: | Trình duyệt Chrome |
I E | I E | I E | I E | I E | I E |
Hướng dẫn JavaScript này giải thích cách sử dụng hàm toán học gọi là vòng [] với cú pháp và ví dụ.
Sự mô tả
Trong javascript, vòng [] là một hàm được sử dụng để trả lại một số được làm tròn cho giá trị số nguyên gần nhất. Bởi vì hàm vòng [] là một hàm tĩnh của đối tượng toán học, nó phải được gọi qua đối tượng giữ chỗ được gọi là toán học.
Cú pháp
Trong JavaScript, chức năng cú pháp cho vòng [] là:
Math.round[number];
Tham số hoặc đối số
Số lượng sẽ được làm tròn.Trả lại
Hàm vòng [] trả về một số được làm tròn cho số nguyên gần nhất. Nói cách khác, số được làm tròn đến 0 thập phân.
Nếu số là giá trị âm, hàm vòng [] làm tròn về 0, đó là hành vi khác với hàm tròn trong các ngôn ngữ khác.
Ghi chú
- Toán học là một đối tượng giữ chỗ chứa các hàm và hằng số toán học của vòng [] là một trong những chức năng này.
Thí dụ
Chúng ta hãy xem một ví dụ về cách sử dụng hàm vòng [] trong javascript.
Ví dụ:
console.log[Math.round[32.65]];
console.log[Math.round[8.1]];
console.log[Math.round[-4.2]];
Trong ví dụ này, chúng tôi đã gọi hàm vòng [] bằng lớp toán học.
Chúng tôi đã viết đầu ra của hàm vòng [] vào nhật ký bảng điều khiển trình duyệt web, cho mục đích trình diễn, để hiển thị hàm vòng tròn [] nào trả về.
Sau đây sẽ là đầu ra vào nhật ký bảng điều khiển trình duyệt web:
33 8 -4
Trong ví dụ này, đầu ra đầu tiên cho nhật ký bảng điều khiển được trả về 33, được làm tròn 32,65 đến số nguyên gần nhất.
Đầu ra thứ hai cho nhật ký bảng điều khiển được trả về 8, được làm tròn 8.1 đến số nguyên gần nhất.
Đầu ra thứ ba cho nhật ký bảng điều khiển được trả về -4, được làm tròn đến số nguyên gần nhất. Lưu ý rằng khi xử lý các số âm, hàm vòng [] làm tròn về 0 và trong trường hợp này, đã trả về -4 và không -5. Hành vi này khác với các hàm tròn trong các ngôn ngữ khác.not -5. This behavior is different than the round functions in other languages.
Nói chung, làm tròn thập phân được thực hiện bằng cách mở rộng:
console.log[Math.round[32.65]];
console.log[Math.round[8.1]];
console.log[Math.round[-4.2]];
7Thực hiện ngây thơ
Sử dụng hàm sau với số nửa chừng, bạn sẽ nhận được giá trị tròn trên như mong đợi hoặc giá trị tròn dưới đôi khi tùy thuộc vào đầu vào.
console.log[Math.round[32.65]];
console.log[Math.round[8.1]];
console.log[Math.round[-4.2]];
8 này trong làm tròn có thể giới thiệu khó phát hiện các lỗi trong mã máy khách.function naiveRound[num, decimalPlaces = 0] {
var p = Math.pow[10, decimalPlaces];
return Math.round[num * p] / p;
}
console.log[ naiveRound[1.245, 2] ]; // 1.25 correct [rounded as expected]
console.log[ naiveRound[1.255, 2] ]; // 1.25 incorrect [should be 1.26]
// testing edge cases
console.log[ naiveRound[1.005, 2] ]; // 1 incorrect [should be 1.01]
console.log[ naiveRound[2.175, 2] ]; // 2.17 incorrect [should be 2.18]
console.log[ naiveRound[5.015, 2] ]; // 5.01 incorrect [should be 5.02]
Để xác định xem một thao tác làm tròn có liên quan đến giá trị điểm giữa hay không, hàm tròn nhân lên giá trị ban đầu được làm tròn bởi 10 ** n, trong đó n là số chữ số phân số mong muốn trong giá trị trả về, sau đó xác định xem phần còn lại Phần của giá trị lớn hơn hoặc bằng 0,5. Điều này
console.log[Math.round[32.65]];
console.log[Math.round[8.1]];
console.log[Math.round[-4.2]];
9 với các giá trị dấu phẩy động là có vấn đề do các vấn đề của định dạng dấu phẩy động với biểu diễn nhị phân và độ chính xác. Điều này có nghĩa là bất kỳ phần phân số nào của một số hơi nhỏ hơn 0,5 [vì mất độ chính xác] sẽ không được làm tròn lên trên.Trong ví dụ trước,
33 8 -40 là giá trị trung điểm nếu nó được làm tròn đến hai vị trí thập phân, giá trị 5.015 * 100 thực sự là
33 8 -41. Bởi vì .4999999999994 nhỏ hơn 0,5, nó được làm tròn xuống 501 và cuối cùng là kết quả là 5,01.
Triển khai tốt hơn
Ký hiệu mũ
Bằng cách chuyển đổi số thành một chuỗi trong ký hiệu theo cấp số nhân, các số dương được làm tròn như mong đợi. Nhưng, hãy lưu ý rằng các số âm tròn khác với số dương.
Trên thực tế, nó thực hiện những gì về cơ bản tương đương với "nửa tròn lên" theo quy tắc, bạn sẽ thấy rằng
33 8 -42 đánh giá thành
33 8 -43 mặc dù
33 8 -44 đánh giá thành
33 8 -45. Phương pháp lodash _.Round sử dụng kỹ thuật này.
/**
* Round half up ['round half towards positive infinity']
* Negative numbers round differently than positive numbers.
*/
function round[num, decimalPlaces = 0] {
num = Math.round[num + "e" + decimalPlaces];
return Number[num + "e" + -decimalPlaces];
}
// test rounding of half
console.log[ round[0.5] ]; // 1
console.log[ round[-0.5] ]; // 0
// testing edge cases
console.log[ round[1.005, 2] ]; // 1.01
console.log[ round[2.175, 2] ]; // 2.18
console.log[ round[5.015, 2] ]; // 5.02
console.log[ round[-1.005, 2] ]; // -1
console.log[ round[-2.175, 2] ]; // -2.17
console.log[ round[-5.015, 2] ]; // -5.01
Nếu bạn muốn hành vi thông thường khi làm tròn các số âm, bạn sẽ cần chuyển đổi số âm thành dương trước khi gọi math.Round [], sau đó chuyển đổi chúng trở lại số âm trước khi quay lại.
// Round half away from zero
function round[num, decimalPlaces = 0] {
if [num < 0]
return -round[-num, decimalPlaces];
num = Math.round[num + "e" + decimalPlaces];
return Number[num + "e" + -decimalPlaces];
}
Làm tròn gần đúng
Để khắc phục vấn đề làm tròn được hiển thị trong ví dụ
33 8 -46 trước đó, chúng ta có thể xác định chức năng làm tròn tùy chỉnh thực hiện thử nghiệm "gần như bằng nhau" để xác định xem giá trị phân số có đủ gần với giá trị trung điểm có thể được làm tròn điểm giữa hay không.
// round half away from zero
function round[num, decimalPlaces = 0] {
if [num < 0]
return -round[-num, decimalPlaces];
var p = Math.pow[10, decimalPlaces];
var n = num * p;
var f = n - Math.floor[n];
var e = Number.EPSILON * n;
// Determine whether this fraction is a midpoint value.
return [f >= .5 - e] ? Math.ceil[n] / p : Math.floor[n] / p;
}
// test rounding of half
console.log[ round[0.5] ]; // 1
console.log[ round[-0.5] ]; // -1
// testing edge cases
console.log[ round[1.005, 2] ]; // 1.01
console.log[ round[2.175, 2] ]; // 2.18
console.log[ round[5.015, 2] ]; // 5.02
console.log[ round[-1.005, 2] ]; // -1.01
console.log[ round[-2.175, 2] ]; // -2.18
console.log[ round[-5.015, 2] ]; // -5.02
Number.EPSILON
Có một kỹ thuật toán học thuần túy khác nhau để thực hiện vòng tròn đến gần nhất [sử dụng "một nửa vòng so với số không"], trong đó hiệu chỉnh Epsilon được áp dụng trước khi gọi hàm làm tròn.
Đơn giản, chúng tôi thêm giá trị float nhỏ nhất có thể [= 1.0 ULP; đơn vị ở vị trí cuối cùng] vào sản phẩm trước khi làm tròn. Điều này chuyển sang giá trị phao có thể đại diện tiếp theo, cách xa số 0, do đó nó sẽ bù đắp lỗi vòng tròn nhị phân có thể xảy ra trong quá trình nhân bằng
33 8 -47.
/**
* Round half away from zero ['commercial' rounding]
* Uses correction to offset floating-point inaccuracies.
* Works symmetrically for positive and negative numbers.
*/
function round[num, decimalPlaces = 0] {
var p = Math.pow[10, decimalPlaces];
var n = [num * p] * [1 + Number.EPSILON];
return Math.round[n] / p;
}
// rounding of half
console.log[ round[0.5] ]; // 1
console.log[ round[-0.5] ]; // -1
// testing edge cases
console.log[ round[1.005, 2] ]; // 1.01
console.log[ round[2.175, 2] ]; // 2.18
console.log[ round[5.015, 2] ]; // 5.02
console.log[ round[-1.005, 2] ]; // -1.01
console.log[ round[-2.175, 2] ]; // -2.18
console.log[ round[-5.015, 2] ]; // -5.02
Sau khi thêm 1 ULP, giá trị 5.015 * 100 là
33 8 -41 sẽ được sửa thành
33 8 -49, điều này sẽ được làm tròn lên tới 502 và cuối cùng là kết quả là 5,02.
Lưu ý rằng kích thước của một đơn vị ở vị trí cuối cùng ["ULP"] được xác định bởi [1] độ lớn của số và [2] epsilon máy tương đối [2^-52]. ULP tương đối lớn hơn với số lượng có cường độ lớn hơn so với số lượng với số lượng có cường độ nhỏ hơn.
Làm tròn gấp đôi
Ở đây, chúng tôi sử dụng phương thức topRecision [] để loại bỏ các lỗi làm tròn điểm nổi trong các tính toán trung gian. Đơn giản, chúng tôi làm tròn đến 15 con số quan trọng để loại bỏ lỗi làm tròn ở chữ số quan trọng thứ 16. Kỹ thuật này để dự đoán kết quả đến các chữ số quan trọng cũng được sử dụng bởi chức năng tròn Php 7.PHP 7 round function.
Giá trị 5.015 * 100 là
33 8 -41 sẽ được làm tròn đầu tiên đến 15 chữ số quan trọng là
function naiveRound[num, decimalPlaces = 0] {
var p = Math.pow[10, decimalPlaces];
return Math.round[num * p] / p;
}
console.log[ naiveRound[1.245, 2] ]; // 1.25 correct [rounded as expected]
console.log[ naiveRound[1.255, 2] ]; // 1.25 incorrect [should be 1.26]
// testing edge cases
console.log[ naiveRound[1.005, 2] ]; // 1 incorrect [should be 1.01]
console.log[ naiveRound[2.175, 2] ]; // 2.17 incorrect [should be 2.18]
console.log[ naiveRound[5.015, 2] ]; // 5.01 incorrect [should be 5.02]
1, sau đó nó sẽ làm tròn lại đến 502 và cuối cùng là kết quả là 5,02.________số 8
Thư viện JavaScript chính xác tùy ý - Decimal.js - decimal.js
// Round half away from zero
function round[num, decimalPlaces = 0] {
return new Decimal[num].toDecimalPlaces[decimalPlaces].toNumber[];
}
// rounding of half
console.log[ round[0.5] ]; // 1
console.log[ round[-0.5] ]; // -1
// testing edge cases
console.log[ round[1.005, 2] ]; // 1.01
console.log[ round[2.175, 2] ]; // 2.18
console.log[ round[5.015, 2] ]; // 5.02
console.log[ round[-1.005, 2] ]; // -1.01
console.log[ round[-2.175, 2] ]; // -2.18
console.log[ round[-5.015, 2] ]; // -5.02
console.log[Math.round[32.65]];
console.log[Math.round[8.1]];
console.log[Math.round[-4.2]];
0Giải pháp 1: Chuỗi theo ký hiệu theo cấp số nhân
Lấy cảm hứng từ giải pháp được cung cấp bởi Kfish tại đây: //stackoverflow.com/a/55521592/4208440
Một giải pháp giảm đơn giản cung cấp cách làm tròn thập phân, sàn và trần chính xác cho một số lượng số thập phân cụ thể mà không cần thêm toàn bộ thư viện. Nó xử lý phao giống như số thập phân bằng cách khắc phục các vấn đề làm tròn nhị phân để tránh kết quả không mong muốn: ví dụ, sàn [[0,1+0,7]*10] sẽ trả về kết quả dự kiến 8.
Các số được làm tròn đến một số chữ số phân số cụ thể. Chỉ định độ chính xác âm sẽ làm tròn đến bất kỳ số lượng địa điểm nào ở bên trái của dấu thập phân.
console.log[Math.round[32.65]];
console.log[Math.round[8.1]];
console.log[Math.round[-4.2]];
1Giải pháp 2: Toán học thuần túy [số.epsilon]
Giải pháp này tránh bất kỳ chuyển đổi / thao tác chuỗi nào vì bất kỳ lý do hiệu suất nào.
console.log[Math.round[32.65]];
console.log[Math.round[8.1]];
console.log[Math.round[-4.2]];
2Giải pháp 3: Làm tròn đôi
Giải pháp này sử dụng phương thức topRecision [] để loại bỏ các lỗi làm tròn điểm nổi.
console.log[Math.round[32.65]];
console.log[Math.round[8.1]];
console.log[Math.round[-4.2]];
3Giải pháp 4: Nhân đôi V2
Giải pháp này giống như Giải pháp 3, tuy nhiên nó sử dụng hàm
function naiveRound[num, decimalPlaces = 0] {
var p = Math.pow[10, decimalPlaces];
return Math.round[num * p] / p;
}
console.log[ naiveRound[1.245, 2] ]; // 1.25 correct [rounded as expected]
console.log[ naiveRound[1.255, 2] ]; // 1.25 incorrect [should be 1.26]
// testing edge cases
console.log[ naiveRound[1.005, 2] ]; // 1 incorrect [should be 1.01]
console.log[ naiveRound[2.175, 2] ]; // 2.17 incorrect [should be 2.18]
console.log[ naiveRound[5.015, 2] ]; // 5.01 incorrect [should be 5.02]
2 tùy chỉnh.console.log[Math.round[32.65]];
console.log[Math.round[8.1]];
console.log[Math.round[-4.2]];
4Điểm chuẩn
//jsbench.github.io/#31ec3a8b3d22bd840f8e6822e681a3ac
Dưới đây là một điểm chuẩn so sánh các hoạt động mỗi giây trong các giải pháp trên trên Chrome 85.0.4183.83. Rõ ràng tất cả các trình duyệt khác nhau, vì vậy số dặm của bạn có thể khác nhau.
Cảm ơn @Mike vì đã thêm ảnh chụp màn hình của điểm chuẩn.