2012-04-19 6 views
1

나는 나의 웹 사이트에있는 지불 요금을 산출하는 기능을 썼다 그러나 javascript와 PHP에있는 다른 결과를 준다. 이 코드를 htm/html 파일에 복사해야합니다. 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로 나눌 수 있습니다 - 모든 FP 오류가 어떤 효과가 너무 작은 것입니다.

+3

충분히 동의 할 수 없습니다. 가능한 한 통화 계산을 처리 할 때 수레를 피하십시오. – EstelS

+1

종종 4 자리 숫자가 사용됩니다. 예 : 환율은 항상 4 자리 10 진수로 게시됩니다. – kirilloid

관련 문제