5

(int)を(double)と一緒に使用していると、正しく機能しないことがあります。
PHPのコード例を見てください。

2つの小数を残してその他を削除する必要があります...

number_format();を知っています。機能しかし私はそれを使用することはできません。四捨五入なので

number_format(24.299,2);
出力:24.30
必要:24.29

<?php

$str="158.2";

echo (double)$str; // Output: 158.2
echo (double)$str*100; // Output: 15820
echo (int)((double)$str*100); // Output: 15819 <-WHY? It Must To Be 15820, Why 15819? 
echo ((int)((double)$str*100)/100); // Output: 158.19
?>

数値に小数点以下2桁を残し、他の小数点以下を四捨五入せずにカットする必要があります。

4

5 に答える 5

5

浮動小数点の精度のため(たとえば、この質問を参照してください:PHP-浮動小数点の精度)、正確158.2 * 100にはではなく、のようなものです。 1582015819.99999999

これ(int)は型変換用であり、丸め用ではなく、ポイントの後の数字はすべて切り取られます。

数値に小数点以下2桁を残し、他の小数点以下を四捨五入せずにカットする必要があります。

これは簡単:

number_format($str, 2);

アップデート

number_format ラウンドするので、もう少し複雑です。

bcmul($str,100,0)/100

bcmul任意精度で乗算します。この場合は0です。結果:

bcmul(158.2,100,0)/100 == 158.2
bcmul(24.299,100,0)/100 == 24.29
于 2013-02-21T15:57:44.313 に答える
1

これは、なぜそれが発生するのか(精度のバグである可能性があります)の質問には答えませんが、問題を解決するには、を使用してみてください$foo = sprintf("%.2f", (float)$str);

例:

$str = "158.2";
$num = (double)$str;
print sprintf("%.2f", $num);

編集:実際、はい、これは精度の問題です。(C ++の場合)小数点以下158.2〜20桁を出力すると、「158.19999999999998863132」の出力が得られます。これは、浮動小数点/倍精度値に固有の問題です。echo sprintf("%.20f", $var);PHPで使用しても同じ効果が見られます。

于 2013-02-21T15:47:19.697 に答える
1

まず、PHPは、 juggleと入力できる言語です。つまり、あなたがやろうとしていることをするために、(int)またはを必要としないということです。(double)

<?php
$str="158.2"; //could also do $str = 158.2
echo $str; // Ouput: 158.2
echo $str * 100; //Output: 15820
echo number_format($str, 2); //Output: 158.20
echo number_format(($str*100)/100, 2); //Output: 158.20
?>

コマンドを使用してnumber_format、数値を希望どおりにフォーマットします。

詳細はこちら

于 2013-02-21T15:47:50.563 に答える
0

未知の分数を整数にキャストしないでください。http://www.php.net/manual/en/language.types.integer.phpのマニュアルを参照してください。 (int) ( (0.1+0.7) * 10 );予想されるように8ではなく7になります。floatからintegerにキャストすると、常に切り捨てられます。また、演算子の優先順位http://php.net/manual/en/language.operators.precedence.phpを確認することもできます。

解決策:キャストする前に分数を計算してください。$fStr = (float) $str; $iStr = (int) $fStr;

于 2013-02-21T15:55:38.423 に答える
0

修理済み。

    function cutDecimals($number,$decimal){
        $_str=(string)$number;
        if(strpos($_str,".")!==false){
            $dotPosition=strpos($_str,".")+1;
            $_numCount=strpos($_str,".");
            $_decimal=strlen($_str)-$dotPosition;

            if($_decimal<$decimal) return (double)$_str;
            else return (double)substr($_str,0,$_numCount+$decimal+1);
        }else return (double)$_str;
    }

    echo cutDecimals("158.099909865",2)."<br />";
    echo cutDecimals("14.02",2)."<br />";
    echo cutDecimals("41.12566",2)."<br />";
    echo cutDecimals("1.981",2)."<br />";
    echo cutDecimals("0.4111",2)."<br />";
    echo cutDecimals("144.2",2)."<br />";
    echo cutDecimals("55.000000",2)."<br />";
    echo cutDecimals("1456115.499811445121",2)."<br />";

?>
于 2013-02-21T15:57:21.083 に答える