Làm tròn 2 chữ số trong javascript

Câu hỏi này rất phức tạp.

Giả sử chúng ta có một hàm, roundTo2DP[num]lấy một số float làm đối số và trả về giá trị được làm tròn đến 2 vị trí thập phân. Mỗi biểu thức này nên đánh giá cái gì?

  • roundTo2DP[0.014999999999999999]
  • roundTo2DP[0.0150000000000000001]
  • roundTo2DP[0.015]

Câu trả lời 'rõ ràng' là ví dụ đầu tiên nên làm tròn đến 0,01 [vì nó gần 0,01 hơn 0,02] trong khi hai ví dụ còn lại làm tròn đến 0,02 [vì 0,0150000000000000001 gần với 0,02 hơn 0,01 và vì 0,015 nằm chính xác giữa chúng và có một quy ước toán học rằng những con số như vậy được làm tròn lên].

Điều mà bạn có thể đoán được là roundTo2DP không thể thực hiện được để đưa ra những câu trả lời rõ ràng đó, bởi vì cả ba số được truyền cho nó đều là cùng một số . Các số dấu phẩy động nhị phân của IEEE 754 [loại được sử dụng bởi JavaScript] không thể biểu thị chính xác hầu hết các số không nguyên và vì vậy cả ba chữ số ở trên được làm tròn thành một số dấu phẩy động hợp lệ gần đó. Con số này, như nó xảy ra, là chính xác

0,01199999999999999944488848768742172978818416595458984375

gần với 0,01 hơn 0,02.

Bạn có thể thấy rằng cả ba số đều giống nhau trên bảng điều khiển trình duyệt, trình bao Node hoặc trình thông dịch JavaScript khác. Chỉ cần so sánh chúng:

> 0.014999999999999999 === 0.0150000000000000001
true

Vì vậy, khi tôi viết m = 0.0150000000000000001, giá trị chính xác củam cái mà tôi kết thúc gần 0.01với nó hơn 0.02. Tuy nhiên, nếu tôi chuyển đổi mthành Chuỗi ...

> var m = 0.0150000000000000001;
> console.log[String[m]];
0.015
> var m = 0.014999999999999999;
> console.log[String[m]];
0.015

... Tôi nhận được 0,015, làm tròn đến 0,02 và đáng chú ý không phải là số thập phân 56 mà tôi đã nói trước đó nói rằng tất cả các số này đều chính xác bằng. Vậy ma thuật đen tối này là gì?

Câu trả lời có thể được tìm thấy trong đặc tả ECMAScript, trong phần 7.1.12.1: ToString được áp dụng cho loại Số . Ở đây các quy tắc để chuyển đổi một số Số m thành Chuỗi được đặt ra. Phần quan trọng là điểm 5, trong đó một số nguyên s được tạo ra có chữ số sẽ được sử dụng trong chuỗi đại diện của m :

Đặt n , ks là các số nguyên sao cho k ≥ 1, 10 k -1s

Bài Viết Liên Quan

Chủ Đề