2009-09-08 40 views
8

Tôi có một câu hỏi liên quan đến hàm toFixed(). Nếu tôi có một phao, ví dụ: - 3.123123423 và . Làm thế nào tôi có thể xuất nó vào hộp đầu vào với toFixed (2) để các giá trị inputbox sẽ là 3.12 và . Ý tôi là nếu giá trị là số nguyên Tôi muốn đầu ra nó mà không trailing .00 :)Chức năng Javascript toFixed

+2

Bạn có thể muốn chỉ định những gì bạn muốn xảy ra trong 3.1 và 3.005. – Mark

+0

làm thế nào về 'parseFloat ((giá trị) .toFixed (2))' –

Trả lời

11

Vì không có sự khác biệt giữa số nguyên và nổi trong JavaScript, đây là cách tiếp cận quick'n'dirty tôi:

theNumber.toFixed(2).replace(".00", ""); 

Hoặc một cái gì đó chung chung:

myToFixed = function (n, digits) { 
    digits = digits || 0; 
    return n.toFixed(digits).replace(new RegExp("\\.0{" + digits + "}"), ""); 
} 

myToFixed(32.1212, 2) --> "32.12" 
myToFixed(32.1212, 0) --> "32" 
myToFixed(32, 2) --> "32" 
myToFixed(32.1, 2) --> "32.10" 
+0

Rất bẩn (và rất nhanh chóng.) ... +1 –

+1

Không hoạt động cho 3.005 (ngụ ý nó là một số nguyên). – Mark

2
function toFixed0d(x, d) 
{ 
    if(Math.round(x) == x) 
    { 
     return x.toString(); 
    }else 
    { 
     return x.toFixed(d); 
    } 
} 

toFixed0d(3.123123423, 2) = "3.12" 
toFixed0d(0, 2) = "0" 
4

Bạn không cần Math.round():

var toFixed = function(val, n) { 
    var result = val.toFixed(n); 
    if (result == val) 
    return val.toString(); 
    return result; 
} 

toFixed(3.123, 2) --> "3.12" 
toFixed(3, 2) --> "3" 
+0

PS: Cũng hoạt động với * .000..0 từ ví dụ: 3.00.toString() == "3" – Matthias

+1

Điều này không thành công đối với bản in (3.10, 2) -> "3.1" nhưng phải là "3.10", tôi đoán vậy. – Fabian

+0

@ Fabian điểm tốt! – Matthias

1

Lưu ý rằng toFixed() là broken in IE và thường không được dựa vào. Các chức năng thay thế được làm tròn nhưng gây khó chịu ở đó.

0

Đây là một chức năng tôi đã đưa ra sau khi suy nghĩ về vấn đề này tương tự cho một thời gian ngắn:

function toFixed (number, n) { 
    return parseFloat(number.toFixed(n)); 
} 

Theo câu hỏi này, chức năng này sẽ trở lại như sau:

toFixed(3.123123423, 2); 
> 3.12 
toFixed(0, 2); 
> 0 
toFixed(3.1, 2); 
> 3.1 
toFixed(3.005, 2); 
> 3 
toFixed(3.005, 3); 
> 3.005 
toFixed(3.0500, 4); 
> 3.05 

Lưu ý rằng phương thức toFixed của đối tượng Number của JavaScript thực sự trả lại String. Hàm toFixed ở trên sẽ trả lại Number. Nếu bạn muốn có một String sau đó sử dụng lệnh sau:

function toFixed (number, n) { 
    return parseFloat(number.toFixed(n)).toString(); 
} 
1

Number.toFixed sản xuất một số kết quả về mặt toán học kỳ lạ và mang đến cho bạn các chữ số phân đoạn mà bạn yêu cầu, cho dù bạn cần đến chúng hay không.

Math.round là toán học đúng, nhưng không cho phép bạn chỉ định độ chính xác.

Đây là một hàm có cả toán học chính xác (bỏ qua các lỗi dấu phẩy động) và cung cấp cho bạn những gì bạn muốn.

var roundToPlusInfinity = function(n, fd) { 
    var scale = Math.pow(10, fd), 
     rounded = fd ? Math.floor((n * scale + 0.5))/scale : 
     Math.round(n); 
    return rounded.toString(); 
}; 

Thuật toán là: mở rộng quy mô để các chữ số bạn muốn là ở bên trái dấu thập phân, thêm 0,5 (do đó> = 0,5 ở nơi không đáng kể đầu tiên gây ra sự tăng của phần nguyên), cắt ngắn (không tròn) và thu nhỏ lại. Có tiềm năng cho các lỗi dấu phẩy động để leo vào, nhưng đó là một cảnh tốt hơn so với hàm toFixed không may.

Kiểm tra nó ra:

roundToPlusInfinity(5.53335, 4); // "5.3334" 
roundToPlusInfinity(-9999.95, 1); // "-9999.9" 
roundToPlusInfinity(3.00015, 3); // "3" 

Do khả năng lỗi dấu chấm động, xuống quy mô có thể cung cấp một kết quả như "3,00000000001", đó là gây phiền nhiễu. Một cái gì đó như thế này nên chăm sóc nó.

var trimFraction = function(s, fd) { 
    var splitPoint = s.indexOf('.'); 
    if (splitPoint === -1) { 
     return s; 
    } 

    var f = s.substring(splitPoint + 1, s.length), 
     i = s.substring(0, splitPoint); 
    if (f.length > fd) { 
     f = f.substring(0, fd).replace(/0+$/, ""); 
    } 
    if (f) { 
     return i + '.' + f; 
    } 
    return i; 
}; 

trimFraction("3.1000000001", 2); // "3.1" 

Bạn chưa làm rõ thuật toán làm tròn bạn muốn. Vòng theo hướng cộng với vô cùng là làm tròn mà bạn đã học ở trường nơi bạn làm tròn> = .5 lên (tức là hướng tới cực dương). Tôi tin rằng trong kế toán, thuật toán làm tròn chính xác (bên ngoài Thụy Sĩ và Argentina ít nhất) là từ số không. Đơn giản:

var roundAwayFromZero = function(n, fd) { 
    var ret = roundToPlusInfinity(Math.abs(n), fd); 
    return (n < 0) ? '-' + ret : ret; 
}; 

roundAwayFromZero(-9999.95, 1); // "-10000" 

Nếu kết quả là để trình bày của con người, Intl.NumberFormat là một khả năng, vì bạn có thể chỉ định số lượng tối thiểu và tối đa các chữ số thập phân. Tại thời điểm viết, nó không được hỗ trợ chính xác rộng rãi và giả sử Chrome triển khai đúng đặc điểm kỹ thuật, sử dụng cùng một thuật toán cắt ngắn sai và không thể hiểu được như toFixed. Thật thú vị, phong cách "tiền tệ" sử dụng roundAwayFromZero (hoặc làm tròn đến một nửa nếu mã tiền tệ là "CHF", đó là một liên lạc tốt đẹp).