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>

誰でも理解できますか?

4

1 に答える 1

7

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

浮動小数点数は0.01正確に表すことはできません。したがって、問題が発生しているのは当然のことです。

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

于 2012-04-19T19:31:03.290 に答える