JavaScript: Làm tròn đến một số chữ số thập phân, nhưng loại bỏ các số 0 thừa


85

Đây là tình huống: Tôi đang nhận được .9999999999999999khi tôi nên đến 1.0.
Tôi có thể đủ khả năng để mất độ chính xác ở vị trí thập phân, vì vậy tôi đang sử dụng .toFixed(15), loại hiệu quả.

Việc làm tròn hoạt động, nhưng vấn đề là tôi được đưa ra 1.000000000000000.
Có cách nào để làm tròn đến một số chữ số thập phân nhưng loại bỏ khoảng trắng thừa không?

Lưu ý: .toPrecisionkhông phải là những gì tôi muốn; Tôi chỉ muốn xác định có bao nhiêu số sau dấu thập phân.
Lưu ý 2: Tôi không thể chỉ sử dụng .toPrecision(1)vì tôi cần giữ độ chính xác cao cho các số thực sự có dữ liệu sau dấu thập phân. Lý tưởng nhất là sẽ có chính xác bao nhiêu chữ số thập phân nếu cần (tối đa 15).


Vấn đề là .toFixed trả về một Chuỗi, vì vậy chỉ cần làm tròn nó qua một Số và sau đó quay trở lại Chuỗi sẽ chuyển đổi lại nó mà không có các số không ở cuối.
Neil

@Nathan: chỉ để làm rõ. Bạn chỉ muốn loại bỏ các số không ở cuối trong chuỗi mà bạn có với toFixed ()?
Jiri Kriz

Câu trả lời:


141
>>> parseFloat(0.9999999.toFixed(4));
1
>>> parseFloat(0.0009999999.toFixed(4));
0.001
>>> parseFloat(0.0000009999999.toFixed(4));
0

4
Đừng quên đặt chúng trong dấu ngoặc đơn khi bạn xử lý số âm: -2.34.toFixed(1)trả về -2.3do toán tử ưu tiên .
Константин Ван

1
Sử dụng toán tử một ngôi + sẽ nhanh hơn parseFloathàm: +number.toFixed(13)Biểu thức này cũng có thể được sử dụng để loại bỏ số JavaScript không chính xác như trong 1.0000000000000045.
ygoe


19

Theo tôi hiểu, bạn muốn xóa các số không ở cuối trong chuỗi mà bạn lấy được qua toFixed(). Đây là một hoạt động chuỗi thuần túy:

var x = 1.1230000;
var y = x.toFixed(15).replace(/0+$/, "");  // ==> 1.123

6
Bạn là người duy nhất thực sự trả lời câu hỏi .. cảm ơn!
Mugen

4
Điều này để lại dấu chấm trên các số tròn ("100,00" => "100.")
pckill

5
@pckill nếu bạn không muốn dấu chấm, bạn có thể đưa nó vào biểu thức chính quy để được thay thế ( ...replace(/\.?0+$/, "");).
Zach Snow

Điều đó không thành công trên 0 và -0 vì 0trở thành chuỗi trống ""-0trở thành -, cả hai đều không được mong đợi (đoán). @ zach-snow giải pháp đề xuất của bạn cũng không thành công trên 0 và -0.
robocat

@Mugen, câu trả lời của Gus có vấn đề gì vậy?
chạy thận

9

Number(n.toFixed(15)) or +(n.toFixed(15)) sẽ chuyển đổi chuỗi thập phân 15 vị trí thành một số, loại bỏ các số 0 ở cuối.


1
Tôi nghĩ tôi sẽ chỉ ra rằng, + (n.toFixed (...)) hiệu quả hơn nhiều so với parseFloat. Không chắc tại sao, nhưng nó cũng hiệu quả hơn Number trong Chrome.
Domino

8

Nếu bạn chuyển giá trị trả về thành một số, các số 0 ở cuối đó sẽ bị loại bỏ. Điều này cũng ít dài dòng hơn parseFloat()hiện tại.

+(4.55555).toFixed(2);
//-> 4.56

+(4).toFixed(2);
//-> 4

Này sử dụng các toán tử + unary , vì vậy nếu sử dụng điều này như một phần của hoạt động chuỗi bạn cần phải có một trung tố + trước khi nó: var n=0.9999999999999999; console.log('output ' + +n.toFixed(2));. FYI một số một + phía trước một chuỗi sẽ chuyển đổi nó thành Một số. Từ MDN: Unary + có thể:

chuyển đổi các biểu diễn chuỗi của số nguyên và số thực, cũng như các giá trị không phải là chuỗi true, false và null. Số nguyên ở cả định dạng thập phân và thập lục phân ("0x" -được định sẵn) đều được hỗ trợ. Số âm được hỗ trợ (mặc dù không dành cho hex). Nếu nó không thể phân tích cú pháp một giá trị cụ thể, nó sẽ đánh giá thành NaN.


@robocat Tôi vừa thực hiện một kiểm tra đơn giản; +(4.1).toFixed(4)4.1trong Chrome 60 .
Константин Ван

Tôi không hiểu. Lý do gì khiến câu trả lời này bị phản đối?
Константин Ван

@K Bạn đã đúng vì vậy tôi đã xóa nhận xét trước đó của mình và thêm vào câu trả lời (Tôi nghĩ rằng tôi đang sử dụng infix + với một chuỗi trên lhs, chứ không phải là sử dụng đơn vị + một cách chính xác. Thường thì tôi cẩn thận hơn! Chúc mừng)
robocat

Câu trả lời này vẫn hoạt động với NaN, Infinity, -Infinity, 3e30 và 0. Một số câu trả lời khác không thành công trong một số trường hợp góc.
robocat

(4) .toFixed (2) -> "4.00" trong Chrome 60.0.3112.113
Daniel Que

1

Không ai trong số này thực sự mang lại cho tôi điều tôi đang tìm kiếm dựa trên tiêu đề câu hỏi, ví dụ: 5,00 là 5 và 5,10 là 5,1. Giải pháp của tôi như sau:

num.toFixed(places).replace(/\.?0+$/, '')

'5.00'.replace(/\.?0+$/, '') // 5
'5.10'.replace(/\.?0+$/, '') // 5.1
'5.0000001'.replace(/\.?0+$/, '') // 5.0000001
'5.0001000'.replace(/\.?0+$/, '') // 5.0001

Lưu ý: regex chỉ hoạt động nếu places > 0

PS https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed


Không bật 5e30(thay đổi số thành 5e3). Các trường hợp góc là ma quỷ!
robocat

0

Có một phương pháp tốt hơn để giữ độ chính xác và cũng loại bỏ các số không. Điều này lấy một số đầu vào và thông qua một số phép thuật ép kiểu sẽ loại bỏ bất kỳ số không ở cuối. Tôi thấy 16 là giới hạn chính xác đối với tôi, điều này khá tốt nếu bạn không đặt vệ tinh lên sao Diêm Vương.

function convertToFixed(inputnum)
{

      var mynum = inputnum.toPrecision(16);
//If you have a string already ignore this first line and change mynum.toString to the inputnum

      var mynumstr = mynum.toString();
    return parseFloat(mynumstr);
    }
    alert(convertToFixed(6.6/6));

0

Các toFixed()phương pháp định dạng một numbersử dụng ký hiệu điểm cố định, và trả về một string.

Nó áp dụng chiến lược làm tròn một nửa .

(0.124).toFixed(2); // returns 0.12
(0.125).toFixed(2); // returns 0.13

Như bạn đã mô tả, nó thực sự cũng sẽ dẫn đến các số 0 ở cuối (có thể không cần thiết) đôi khi.

(0.001).toFixed(2); // returns 0.00

Bạn có thể không muốn loại bỏ những số 0 ở cuối đó, về cơ bản bạn chỉ có thể chuyển nó trở lại thành a number. Có rất nhiều cách để làm điều này.

+(0.001).toFixed(2); // the shortest

Để biết tổng quan, về các phương pháp khác nhau để chuyển đổi chuỗi thành số, vui lòng kiểm tra câu hỏi này , có một số câu trả lời tuyệt vời.

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.