2011-01-09 21 views
34

Tôi có chức năng javascript tự động thêm các trường nhập cùng nhau, nhưng thêm các số như 1,35 + 1,35 + 1,35 mang lại cho tôi sản lượng 4.050000000000001, giống như một ví dụ. Làm thế nào tôi có thể làm tròn tổng số thập phân thứ hai thay cho chuỗi dài đó?parseFloat làm tròn

Các trường nhập sẽ có nhiều hơn chỉ là ví dụ 1.35 vì vậy tôi cần tổng số không bao giờ có nhiều hơn 2 điểm sau dấu thập phân. Dưới đây là đoạn code làm việc đầy đủ:

<html> 
<head> 
<script type="text/javascript"> 
function Calc(className){ 
var elements = document.getElementsByClassName(className); 
var total = 0; 

for(var i = 0; i < elements.length; ++i){ 
total += parseFloat(elements[i].value); 
} 

document.form0.total.value = total; 
} 

function addone(field) { 
    field.value = Number(field.value) + 1; 
    Calc('add'); 
} 
</script> 
</head> 
<body> 
<form name="form0" id="form0"> 
1: <input type="text" name="box1" id="box1" class="add" value="0" onKeyUp="Calc('add')" onChange="updatesum()" onClick="this.focus();this.select();" /> 
<input type="button" value=" + " onclick="addone(box1);"> 
<br /> 

2: <input type="text" name="box2" id="box2" class="add" value="0" onKeyUp="Calc('add')" onClick="this.focus();this.select();" /> 
<input type="button" value=" + " onclick="addone(box2);"> 
<br /> 

<br /> 
Total: <input readonly style="border:0px; font-size:14; color:red;" id="total" name="total"> 
<br /> 
</form> 
</body></html> 

Một số điều tôi đã cố gắng, mà nên làm việc nhưng tôi đang thực hiện rõ ràng chúng không đúng cách:

for(var i = 0; i < elements.length; ++i){ 
total += parseFloat(elements[i].value.toString().match(/^\d+(?:\.\d{0,2})?/)); 

var str = total.toFixed(2); 

hoặc

for(var i = 0; i < elements.length; ++i){ 
total += parseFloat(elements[i].value * 100)/100).toFixed(2) 

cũng đã không có may mắn với Math.floor

+0

Bạn không thực sự cần đăng tất cả mã vì nó không thực sự liên quan đến câu hỏi ở đây. Chỉ đăng các bit liên quan. – marcog

+0

FYI: Đoạn mã thứ hai (liên quan đến toFixed) của bạn có lỗi cú pháp. –

+0

Để tham khảo trong tương lai, nó được giải quyết nhờ @marcog bằng cách sử dụng: 'document.form0.total.value = total.toFixed (2);' –

Trả lời

52

Sử dụng toFixed() để làm tròn num đến 2 chữ số thập phân bằng cách sử dụng phương pháp làm tròn truyền thống. Nó sẽ tròn 4.050000000000001 đến 4.05.

num.toFixed(2); 

Bạn có thể thích sử dụng toPrecision(), sẽ loại bỏ bất kỳ số 0 kết quả nào.

Example:

1.35+1.35+1.35 => 4.050000000000001 
(1.35+1.35+1.35).toFixed(2)  => 4.05 
(1.35+1.35+1.35).toPrecision(3) => 4.05 

// or... 
(1.35+1.35+1.35).toFixed(4)  => 4.0500 
(1.35+1.35+1.35).toPrecision(4) => 4.05 

tham khảo: JavaScript Number Format - Decimal Precision

+0

Tài liệu tham khảo là hữu ích, nhưng tôi không thể tìm ra những gì tôi đang làm sai, nó phải là vị trí của tôi 'toFixed'. Nhận xét của tôi ở trên cung cấp thêm chi tiết cho mục tiêu cuối cùng –

+0

@Josh Đoạn trích thứ hai của bạn không tốt, bạn không muốn làm tròn sau mỗi lần thêm. Cái đầu tiên của bạn trông có vẻ đúng - vấn đề gì đang mang lại cho bạn? Bạn có chắc là bạn đang sử dụng 'str' sau đó không? – marcog

+1

Khi bạn cố định nó, hãy đánh dấu phần này là câu trả lời. Anh ta đã đi sâu hơn để thích ứng với bạn. –

3
var num = 4.050000000000001; 

num = num.toFixed(2); 

toFixed sẽ làm tròn lên tùy thuộc vào có bao nhiêu chữ số sau chữ số thập phân bạn đang tìm kiếm.

+0

Im tìm cách có tổng số (cái gì bao giờ tổng số kết thúc lên được) không bao giờ có nhiều hơn 2 số sau dấu thập phân. Tổng số có thể là 6.300000000000001. Ive đã thử sử dụng các biến thể khác nhau của 'toFixed' nhưng tôi không thể tìm ra vị trí để đặt tổng số không bao giờ có nhiều hơn 2 sau số thập phân –

+2

@Josh Gọi 'toFixed' trên giá trị trước khi hiển thị nó, ví dụ: 'document.form0.total.value = total.toFixed (2)'; – marcog

+0

@marcog đã thực hiện thủ thuật. Tôi có trường thứ hai chia tổng số là 25 mà tôi cũng đang tìm cách giới hạn số thập phân nhưng cùng một mã không hoạt động: 'document.form0.divided.value = total/25.toFixed (2);' –

0

Thay vì làm tròn, bạn có thể muốn sử dụng port of Java's BigDecimal để thực sự có được phép tính thập phân chính xác.

+0

Tôi không chắc là cần thiết ở đây. Tính toán của anh ta là 1,35 * 3. – marcog

+0

@marcog: và anh ta nhận được 4.050000000000001 thay vì kết quả chính xác. –

+0

Có lẽ phiên bản Javascript là khác nhau, nhưng lớp Java không giống nhau - http://ideone.com/KqkvN – marcog

1

này hoạt động:

$(document).ready(
    function() { 
      $('#field1').blur(function(){ $('#field2').val(parseFloat($(this).val() * 2.2).toFixed(1)); }); 
      $('#field2').blur(function(){ $('#field1').val(parseFloat($(this).val()/2.2).toFixed(1)); }); 
    } 
); 

này thất bại:

$(document).ready(
    function() { 
      $('#field1').blur(function(){ $('#field2').val(parseFloat($(this).val() * 2.2)).toFixed(1); }); 
      $('#field2').blur(function(){ $('#field1').val(parseFloat($(this).val()/2.2)).toFixed(1); }); 
    } 
); 

Vì vậy, hãy cẩn thận cách bạn đặt ngoặc của bạn() ... Trong trường hợp đầu tiên, làm tròn sẽ làm việc, nhưng chiến thắng' t làm việc trong một thứ hai ...

+0

Bạn nên làm cho nó rõ ràng khi jQuery là một điều kiện tiên quyết, vì nó có thể gây nhầm lẫn và bực bội cho người mới bắt đầu nhập mã này mà không có thư viện jQuery và thấy rằng nó không hoạt động. Không phải ai cũng sử dụng jQuery. –

1

Bạn có thể sử dụng Math.round(total*100000000000)/100000000000; trong mã. Nó sẽ hoạt động đối với hầu hết các trường hợp