2011-06-22 90 views
6

我在PHP和JavaScript整數的方式有一些問題。我使用PHP的全面功能,這javascript函數:JavaScript VS PHP四捨五入

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

我試圖將該數字四捨五入爲43.65 * 2.5 + 40%,這在使用計算器進行= 152.775或者當PHP = 152.78圓。

在javascript中,當我做的console.log數量是152.774999999998,當上述功能四捨五入給我152.77

任何有助於reslove這個問題是極大的讚賞

+1

削減這就是爲什麼我們不使用浮點數的貨幣。 –

+0

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

+0

確保當你使用'parseInt'指定一個基數時;通常你想在10的基礎上工作,所以:'parseInt(yourNumber,10)'。 – nnnnnn

回答

2

請看看How to deal with floating point number precision in JavaScript?

下面是一個例子

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

以15.803失敗,給出15.81,同時它應該給15.80 – max4ever

+0

謝謝。如果我做一個簡單的回合,它會起作用。查看更新 – mplungjan

+0

適用於25.575(=> ​​25.58),但未通過0.575(=> ​​0.57) – modernzombie

5

這不是什麼這與舍入本身有關,而是與如何在基於二進制的硬件中表示十進制數字有關。

查看floating point guide瞭解更多關於此的信息,以及解決方案/替代品。

1

php輪到152.78,因爲它看到152.77499這是152.775,並在最後152.178。你不能使用PHP的四捨五入值嗎?對於數字格式的JavaScript函數如下

-1

查找

<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

這似乎有點過分了 - 我覺得它很糟糕的形式不信任你從哪裏得到它。 HTTP://www.codingforums。com/archive/index.php/t-190997.html – mplungjan

1

這是因爲不同的精度u JS(通過瀏覽器)和PHP,或者實際上有多少位用於存儲數字。

,你可以讓你的JS取整函數做到這輪第2位 Math.round(floatNumber*100)/100

3

我想在這一點,並希望分享我的解決辦法,不要讓它白白浪費:

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); 
} 

這不使用字符串函數或任何強制上移或下移四捨五入。

測試在這裏:http://jsfiddle.net/inti/hMrsp/4/

編輯:改正的零點末

+0

var v = 152.79499999999998; - 失去結果0 – mplungjan

+0

@mplungjan更正它。 – aorcsik

+0

感謝兄弟,出於某種原因,這一個工作與一切,而mplungjan的版本在14.803失敗的例子 – max4ever