2011-10-19 3 views
1

PHPスクリプトから価格を計算する際に問題が発生しています。PHP - パーセンテージに基づいて数値を計算する方法、2ヶ月後にすべての精度を落とす方法は?

多くの議論の末、私の悲しみの原因はPHPが実際に動作する方法に属することに気付きました。これはほとんどの人が知っている可能性が高いので、私はこれを指摘し、これを実現していない人々のために時間を節約するべきだと思っています。

Phpは、乗算処理中に有限の結果を生成します。 1.246256343のように。今私はアウトストアで使用されているPOSシステム(非PHPベース)が丸めの可能性にかかわらず、小数点以下2桁後に任意の数字を落としているように見えます。 1.246のように、自然に考えるかもしれないので1.24ではなく1.25と計算されます。

これで、私はこの計算を行うためにPHPを使用するときにこの効果を生み出す方法を探しています。私は今、かなりの時間round()に手を染め、しかし、このインスタンスで使用する場合、それは1.25に1.246を丸めるように、これは最初の場所で問題の根本であることを恐れされています:

$prCalcPrice = round($prPrice/1.02, 2); 

それとも、この1

$prCalcPrice = round($prPrice/1.02, 2, PHP_ROUND_HALF_DOWN); 

は今、私は基本的に1.246の結果は、1.24の値を生成し、ないだろう1.25、小数点以下の後に任意の桁の値を除いた結果を出力に方法が必要です。

これに関するアイデアや提案はありますか?

また、過去にこれが問題になっていて、チュートリアルや他のページの形式で有用な情報を見つけた場合は、投稿してください!

+1

私に言えば、1.41999は1.41より1.41に近いですか?それは非常に非科学的です。 – NullUserException

+0

@ NullUserException非常にですが、このレガシーシステムはそのように動作します。私たちがオンラインカタルーニャを提供することを計画しているので、これまでの最も簡単なアプローチはこれまでのことでした...今まで:s –

答えて

1

をそれを行う方法は複数あります。

$n = 21.2463; 

// select 2 digit characters after a point 
preg_match('/(.*\.[0-9]{2})/', $n, $matches); 

echo $matches[1]; // 21.24 

// multiply by 100, cast to int, divide by 100 
echo ((int)($n*100)/100); // 21.24 

など

+0

最終的には、私にとって最も有益なものでした。どうもありがとうございます! –

2

10^2でmultiplationと分裂と組み合わせfloor機能(あなたは2桁の10進数の精度で丸めるよう)を使用してください:あなたは小数点以下2桁でちょうど興味があるなら

$roundedPrice = floor($price * 100)/100; 
1

あなただけの表示の目的のためにこれをやっている、とあなたが説明するように、実際に番号を保存する必要がない場合は、適切な方法はsprintfのです:

sprintf('%.2f', $number) 

正規表現は不必要に高価であり、フォーマットするための余分な計算をするだけで面倒です。

これはあなたのコントロール下にあるかもしれませんが、実際に値をさらに計算する必要がある場合は、まずは浮動小数点で作業しないことをお勧めします。実際、金融システムを使って作業するときはいつでも、浮動小数点数を使うべきではありません。浮動小数点計算は正確であるとは保証されません。あなたのお金の価値を整数に変換してから計算します。

1.29 dollars = 129 cents 
129 cents * .50 = 64.5 cents 
intval(64.5) = $0.64 

残りの部分を説明するために、通常、システムは値をNセントのセントに格納します。

+1

私のお詫びは、これをテストした後、あなたのためにはうまくいかないでしょう。私はsprintf()が実際にフォーマットされた数値を丸めることを認識しませんでした。 –

+0

あなたのご意見はお寄せいただきありがとうございますが、表示目的ではありません。システムは実際にこの丸められた図の総コストを計算します.2の後の小数値の後は除きます。 –

関連する問題