2012-04-19 8 views
1

私は自分のウェブサイトで支払い手数料を計算する関数を書いていますが、javascriptとphpでは別の結果が得られます。 このコードをhtm/htmlファイルにコピーする必要があります。サーバー側とクライアント側で、1つの数式が異なる結果になっていますか?

bug.phpのコード:

<table style="background-color:#ccc; width:600px; font-family:Tahoma"> 
<tbody><tr style="background-color:#00CCFF"><td>original number</td><td>phpToFixed()</td><td>jsToFixed()</td><td>phpCalc</td><td>jsCalc</td></tr> 
<script> 
function jsToFixed(i) { 
return(Math.floor(i * 100)/100); 
} 
function jsCalc(ob){ 
    val=jsToFixed(ob); 
    if(val>0&&val!=''){ 
    result = jsToFixed(0.95*ob); 
    }else{ 

    result = 0; 
    } 
    if(result==val&&result!=0){ 
    result-=0.01; 
    } 
return result; 
} 
<?php 
function phpToFixed($amount){ 
$inp= floor($amount * 100)/100; 
return $inp; 
} 
function phpCalc($amount){ 
$inp= phpToFixed($amount); 

    if($inp>0&&$inp!=''){ 
$result = phpToFixed($amount*0.95); 

    }else{ 
$result = 0; 
    } 
if($result==$inp&&$result!=0){ 
$result-=0.01; 
} 
return $result; 
} 
for($i=0;$i<1;$i+=0.009){ 
?> 
document.write("<tr><td class='org'><? echo $i; ?> </td><td class='fix'> <? echo phpToFixed($i); ?> </td><td class='fix'>"+jsToFixed(<? echo $i; ?>)+"</td><td class='calc'>"+jsCalc(<? echo $i; ?>)+"</td><td class='calc'>"+<? echo phpCalc($i); ?>+" </td></tr> "); 
<?php 
} 
?> 
</script> 
</tbody> 
</table> 

いずれかが把握できますか?

+1

http://stackoverflow.com/questions/1458633/elegant-workaround-for-javascript-floating-point-number-problemが役立つ可能性があります。 – Loktar

答えて

6

通貨を扱うときは、常に整数の数学を使用します。たとえば、通貨が米ドルの場合、常にセントで価格を計算します。

浮動小数点数は、正確には0.01を表すことはできません。したがって、あなたが問題を抱えていることは驚くことではありません。

一方、整数は1を正確に表します。計算が完了したら、100とroundを小数点以下2桁に分けることができます.FPエラーは小さすぎて効果がありません。

+3

十分に一致しません。可能な限り通貨計算を処理するときは、浮動小数点を避けてください。 – EstelS

+1

しばしば4桁も使用されます。例えば。為替レートは常に4桁の10進数で公表されます。 – kirilloid

関連する問題