2011-06-22 38 views
6

Tôi đang gặp một số vấn đề với cách thức số vòng tròn PHP và javascript. Tôi đang sử dụng chức năng vòng PHP và chức năng javascript này:Javascript VS PHP làm tròn

function roundNumber(number, decimals) {  
    var newnumber = new Number(number+'').toFixed(parseInt(decimals)); 
    var value = parseFloat(newnumber); 
    return value; 
} 

Số tôi đang cố gắng để làm tròn là 43,65 * 2,5 + 40% mà khi thực hiện bằng cách sử dụng máy tính = 152,775 hoặc khi làm tròn trong PHP = 152,78.

Trong javascript khi tôi làm một console.log số là 152,774999999998 và khi tròn với các chức năng trên mang lại cho tôi 152,77

Bất kỳ sự giúp đỡ để reslove vấn đề này được rất nhiều đánh giá cao

+1

Đây là lý do tại sao chúng ta không sử dụng số dấu chấm động cho tiền tệ. –

+0

http://stackoverflow.com/questions/5490687/broken-tofixed-implementation – mplungjan

+0

Hãy chắc chắn rằng khi bạn sử dụng 'parseInt' mà bạn chỉ định một cơ số; thông thường bạn muốn làm việc trong cơ sở 10, vì vậy: 'parseInt (yourNumber, 10)'. – nnnnnn

Trả lời

2

hãy có một cái nhìn tại How to deal with floating point number precision in JavaScript?

Dưới đây là một ví dụ

function roundNumber(number, decimals) { 
 
    decimals = parseInt(decimals,10); 
 
    var dec = Math.pow(10,decimals) 
 
    console.log(dec,parseFloat(number)*dec); 
 
    number=""+Math.round(parseFloat(number)*dec+.0000000000001); // fixed the .X99999999999 
 
    return parseFloat(number.slice(0,-1*decimals) + "." + number.slice(-1*decimals))  
 
} 
 

 

 
var val = 43.65 * 2.5; 
 
    val+= val*0.40 
 

 
console.log(val+' ~= 152.78? --> '+roundNumber(val,2).toFixed(2)); 
 
console.log('15.803 ~= 15.80? --> '+roundNumber(15.803,2).toFixed(2)); 
 
console.log('15.805 ~= 15.81? --> '+roundNumber(15.805,2).toFixed(2)); 
 
console.log('14.803 ~= 14.80? --> '+roundNumber(14.803,2).toFixed(2)); 
 
console.log('0.575 ~= 0.58? --> '+roundNumber(0.575,2).toFixed(2));

+0

không thành công với 15,803, cho 15,81 trong khi nó nên cho 15,80 – max4ever

+0

cảm ơn. Nó hoạt động nếu tôi làm một vòng đơn giản. Xem các cập nhật – mplungjan

+0

Hoạt động cho 25.575 (=> 25.58) nhưng không thành công cho 0.575 (=> 0.57) – modernzombie

5

Đây không phải là bất cứ điều gì để làm với làm tròn cho mỗi se, nhưng là để làm với cách số thập phân được đại diện trong phần cứng dựa trên nhị phân.

Kiểm tra floating point guide để biết thêm thông tin về điều này, cũng như các giải pháp/lựa chọn thay thế.

1

vòng php tới 152,78, bởi vì nó thấy 152,77499 là 152,775 và cuối cùng là 152,178. bạn không thể sử dụng giá trị làm tròn từ php?

-1

tìm thấy bên dưới hàm javascript để định dạng số

<script type="text/javascript"> 
function format_number(pnumber,decimals){ 
    if (isNaN(pnumber)) { return 0}; 
    if (pnumber=='') { return 0}; 

    var snum = new String(pnumber); 
    var sec = snum.split('.'); 
    var whole = parseFloat(sec[0]); 
    var result = ''; 

    if(sec.length > 1){ 
     var dec = new String(sec[1]); 
     dec = String(parseFloat(sec[1])/Math.pow(10,(dec.length - decimals))); 
     dec = String(whole + Math.round(parseFloat(dec))/Math.pow(10,decimals)); 
     var dot = dec.indexOf('.'); 
     if(dot == -1){ 
      dec += '.'; 
      dot = dec.indexOf('.'); 
     } 
     while(dec.length <= dot + decimals) { dec += '0'; } 
     result = dec; 
    } else{ 
     var dot; 
     var dec = new String(whole); 
     dec += '.'; 
     dot = dec.indexOf('.'); 
     while(dec.length <= dot + decimals) { dec += '0'; } 
     result = dec; 
    } 
    return result; 
} 

var value = format_number(newnumber,2); 
</script> 
+1

Điều đó có vẻ hơi quá mức - và tôi thấy hình thức nghèo nàn không phải là tín dụng khi bạn nhận được nó. http: //www.codingforums.com/archive/index.php/t-190997.html – mplungjan

1

Đó là vì sự khác nhau các biện pháp u sed trong JS (bởi trình duyệt) và PHP hoặc thực sự có bao nhiêu bit được sử dụng để lưu trữ các số.

bạn có thể làm cho JS của bạn chức năng làm tròn làm điều này để tròn đến chữ số thứ 2 Math.round(floatNumber*100)/100

3

Tôi đã suy nghĩ một chút về vấn đề này, và muốn chia sẻ giải pháp của tôi, để cho nó không đi đến chất thải:

function roundNumber(number, decimals) {  
    var d = parseInt(decimals,10), 
     dx = Math.pow(10,d), 
     n = parseFloat(number), 
     f = Math.round(Math.round(n * dx * 10)/10)/dx; 
    return f.toFixed(d); 
} 

Tính năng này không sử dụng các chức năng chuỗi hoặc bất kỳ vòng quay lên hoặc xuống bắt buộc nào.

Kiểm tra nó ở đây: http://jsfiddle.net/inti/hMrsp/4/

Edit: sửa chữa, đã cắt giảm số không vào cuối

+0

Không trên var v = 152.79499999999998; - mất dấu 0 – mplungjan

+0

@mplungjan Đã sửa lỗi đó. – aorcsik

+0

cảm ơn dude, vì một số lý do này làm việc với tất cả mọi thứ trong khi phiên bản của mplungjan không thành công trên 14.803 ví dụ – max4ever