2012-04-12 12 views
0

数字のグループを集計すると、時々私はいくつかの小数点以下の小数で終わるでしょうか?数値が文字列として解析されると、なぜそれが起こりますか?私は、 "山車について!& "%" 程度数値の合計が奇数小数を返しますか?

function parse(){ 
    foreach($_SESSION['import_csv_posts']['result']['csv'] as $key => $post){ 
     $amount = $this->parse_amount($post[$this->param['amount']]); 
     if($this->param['vat_amount']){ 
      $amount += $this->parse_amount($post[$this->param['vat_amount']]); 
     } 

     $this->balance += $amount; 
     echo "$amount\n"; 
    } 

    echo "\nbalance = ".$this->balance; 
} 

function parse_amount($amount){ 
    $amount = strval($amount); 
    if(strstr($amount, '.') && strstr($amount, ',')){ 
     preg_match('/^\-?\d+([\.,]{1})/', $amount, $match); 
     $amount = str_replace($match[1], '', $amount); 
    } 

    return str_replace(',', '.', $amount); 
} 

結果

-87329.00 
-257700.00 
-11400.00 
-9120.00 
-47485.00 
-15504.00 
122800.00 
1836.00 
1254.00 
200.00 
360.00 
31680.00 
361.60 
1979.20 
1144.00 
7520.00 
6249.49 
balance = -399.00000000003 
+0

「小数点以下の桁数」とは何ですか? – deceze

+1

大丈夫、私の無知を許してください。しかし、フロート値を取得するために文字列を解析している場所がわかりません。 – Adi

+0

@adnan '+ ='を使うと自動的に起こります。 – deceze

答えて

3

浮く!&" いくつかの%が存在しているはず山車は、単に正確ではないしていることです。有限の空間に無限の数がどのように格納されるかには、ある種の不正確さがあります。したがって、浮動小数点数で数学を行う場合、100%正確な結果は得られません。

format numbersを出力時に小数点以下第2位にするか、または文字列とBC Math packageを使用するかを選択します。これは遅く正確ですが、

1

結果が小数で表示されている間に、浮動小数点演算はバイナリでコンピュータによって行われます。両方のシステムで同じように正確に表すことができない数字がたくさんあるので、人間が期待している結果と実際にビットと見なされる結果との間には、ほとんどの点で違いがあります(これが原因ではありません平等のためにフロートを確実に比較する)。

数値が文字列を解析して生成されても問題はありません。PHPが算術演算子を見るとすぐに文字列を数値に内部的に変換します。

あなたはは、単に小数点以下の桁数を制限するために、フォーマット文字列のような%.2fprintfを使用します(あなたは、単にものを表示しているとして、あなたが、いないように見える)絶対精度を必要としない場合。

関連する問題