[過去ログ] Perlについての質問箱 64箱目 (1002レス)
上下前次1-新
抽出解除 レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
111(5): 2019/11/06(水)01:45 ID:yvB3xxPc(1/5) AAS
消費税計算(10%)しようとしました。税込550円を消費税と本体価格にする。
$a = 550;
$b = 1.1;
$c = $a / $b;
$d = $a - $c;
$e = int($c);
$f = int ($d);
print すると、
$c は 500
$d は 50.000000000001(0の数はだいたい)
$e は 499
$d は 50
とうやら550 / 1.1 が内部的に割り切れていない様子(おそらく実際は内部的に499.99999999999999になってるのでintすると499に)
ロジックの変更で回避したけど、このバグ聞いたことありますか?
112(1): 2019/11/06(水)02:54 ID:normnvJW(1/2) AAS
>>111
バグじゃなくて仕様やろ。
Perlの数値型はdoubleなので、1.1が正確に表現できてないんちゃう?
浮動小数点数の誤差についてぐぐれ。
113(1): 2019/11/06(水)03:29 ID:normnvJW(2/2) AAS
>>111
おせっかいかもだがもうひとつ。
その手の誤差を回避するのは、ロジックでなんとかできることもあるが、実際にはなかなか難しいはず。
たまたま誤差が見えなくなってるだけの可能性もありそうなので、動作確認は慎重にな。
ちゃんとやるなら、decimal的なモジュールを使ったほうが。
あるかどうかは知らんけど。
114(1): 2019/11/06(水)03:46 ID:QwLiS9cf(1) AAS
>>111
バクではなく仕様。
ちなみにPython,Tclで確認してみましたが同じ出力結果になりました。
どんな言語でも金額の計算や小数点の桁を調整をする場合、
int(切り捨て)、round(四捨五入)、ceil(切り上げ)などで処理するか、
出力時に、printfやsprintfを使って、"%.0f"などを指定して桁を合わせる
必要があると思います。
117(1): 2019/11/06(水)09:28 ID:i85ttsqs(1/4) AAS
>>111
それはバグではないし、昔々からある超有名な仕様。知らないのはお前だけ。
121(1): 2019/11/06(水)18:58 ID:yvB3xxPc(3/5) AAS
>>111
一応、取った対応策です(消費税計算なので精度は不要)
除算解は有効桁数以下が切り捨てになり表示などで見える値以下になると想定しました
$a = 550;
$b = 1.1;
$c = ;
$tax= int($a - $a / $b); # $tax = 50
$net = $a - $tax; # $net = 500
端数を残したまま税込から除算解を引いてintして税とし、税込から税を引いて本体としました
とりあえず期待した結果は得られています
ありがとうございました。
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.029s