質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

4回答

990閲覧

税込価格から本体価格と消費税額を計算する

NCC1701

総合スコア1680

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

2クリップ

投稿2024/02/29 06:22

実現したいこと

単純の計算式だと

税込価格 / 1.1 -> 本体価格、税込価格 / 1.1 * 0.1 -> 消費税額

になりますが、金額によって変な結果(計算結果が間違っているわけではない)になってしまいます。どのような計算をすれば良いのか?あるいは、どのように実装・運用されているのか教えてください。
(ひとまず小数点以下は切り捨てで統一、状況を単純化するため税率は10%に固定)

発生している問題・分からないこと

どの言語でも同様だと思いますので、エクセルの関数で代表させます
本体価格 = ROUNDDOWN(税込価格 / 1.1)
消費税額 = ROUNDDOWN(税込価格 / 1.1 * 0.1)

(問題ない事案)
税込価格 = 55,000 → 本体価格 = 50,000、消費税額 = 5,000

(問題あり1)
税込価格 = 54,999 → 本体価格 = 49,999、消費税額 = 4,999
計算結果から本体価格と消費税額を足すと、54,998 になり出発点である税込価格の54,999と矛盾する

(問題あり2)
上記の問題発生により計算式を変更する
消費税額 = ROUNDDOWN(税込価格 / 1.1 * 0.1)
本体価格 = 税込価格 - 消費税額

税込価格 = 54,999 → 消費税額 = 4,999、本体価格 = 50,000
計算結果の本体価格を出発点として消費税額を計算すると5,000円になるはず

1円ずつ違う値にすると、11回に1回サイクリックにこのような結果になる金額に遭遇します。(なので解決できる何らかのアルゴリズムがあるのかもしれません)

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

同じ疑問に言及するものはありませんでした。

切り捨て(切り上げ)が計算途中に含まれるので誤差が出るのは理屈ですが、レシートなどで表示されたときそれを見た人が「ん?」とならない方法はないものかというのが質問の動機です。
(50,000円に対する消費税額が4,999円と表示されていたら、ん?とは思うけど得した気分になるから文句は言われないと思いますが...)

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tabuu

2024/02/29 06:52

本体価格を49,999.10円(小数点2桁の場合)にすればより近しい数字になると思いますがいかがでしょうか
fana

2024/02/29 07:22 編集

消費税に詳しくないのですが, まず本体価格(整数)があって→そこから税額(整数)を決めて→両者を加算したものが税込価格(整数) という話において, 「税込価格しかわからない」=「この真ん中の税額を決めるところで小数点以下がどう扱われたのかが不明」 という状況なのであれば,そこから本体価格と消費税額を一意に決定することはできないのではないでしょうか? …とか思ったりするのですが,どうなんでしょう? 「うちでは消費税の小数点以下は 切り捨て/切り上げ で扱っている」という話があるのならば,それに基づいて逆算してやればよいのでは. 税込が 54999 というのは, 切り上げならば,本体が 49999 で消費税が5000 なのであって, 切り捨ての場合はそもそもあり得ない値,ということでは…?
68user

2024/02/29 07:10

なので、  ・税抜価格 * 1.1 → 税込価格  ・税込価格 / 1.1 → 税抜価格 のどちらでいくのか自分で決めてください (要は積み上げ方式か割り戻し方式か)。 また端数の扱いは切り上げ・切り捨て・四捨五入のどれにするか自分で決めてください。 ちなみにインボイス対応を機に、10% などの税率をかけるのは 1回だけなどとルール化されています。 > レシートなどで表示されたときそれを見た人が「ん?」とならない方法はないものか ないです。端数処理しているわけで誤差は必ず出ます。
NCC1701

2024/02/29 08:37

状況としては、先に税込価格の決定があってそれに応じたインボイスを発行する(レシートとか領収証とか)というシーンです。 ビジネス用語的ないわゆる価格戦略(プライシング)の場面で、コストプラス方式的だったら出発点が本体価格なので問題ないのですが、需要価格方式的(あくまで的なのですが)だと初めに請求額(税込額)ありきになるケースがあります。(隣の八百屋が100円で売るならうちは99円だ、みたいなケースです) 計算上はどうしても誤差を避けられない数値があるので、同様の内容に関する知見がすでにあるのではないかと、質問しました。
fana

2024/02/29 08:57

素人なので > 知見 とか無いですが, 本体価格 = 税込価格 * 10.0 / 11.0 税額 = 税込価格 * 1.0 / 11.0 なる計算結果のうち,整数により近い側をその整数に修正してやって→他方はそれを用いた引き算で求めるとかじゃダメなんですかね?
logres_Fan

2024/02/29 09:25

よくわからないので、教えて下さい。 税込価格から本体価格と消費税額を計算する必要性、アルゴリズムの需要があるのかしら? 本体価格と税率から税込価格を計算しないの。
68user

2024/02/29 09:50

よくわかりません。税込価格を出発点にするならそうすればいいのに、なぜ > 計算結果の本体価格を出発点として消費税額を計算すると5,000円になるはず 本体価格を出発点にすると計算が合わないとか言っているので?
logres_Fan

2024/02/29 13:59

税込価格を出発点にするなら、税率が変わるたびに出発点を全部設定し直す羽目にならないかしら?
YellowGreen

2024/03/01 01:55

取引価格から消費税を算出するなら、 消費税額 = 取引(税込)価格 * 10 / 110(1円未満の端数処理) 税抜価格 = 取引(税込)価格 - 消費税額 とするのではないでしょうか。
ikedas

2024/03/02 01:22 編集

> 本体価格 = ROUNDDOWN(税込価格 / 1.1) > 消費税額 = ROUNDDOWN(税込価格 / 1.1 * 0.1) これは単に計算がまちがっています。 消費税額は、本体価格×税率 で計算される値を端数処理して得られます。これを逆算して消費税額から本体価格を得ようとするのなら、(ROUNDDOWNなどで再び端数処理をするのではなく)「端数処理する前の値として可能な値のの範囲」を求めなければなりません。 この条件を満たす式はは、端数処理を切り捨てとした場合、 | 税込価格 ≦ 本体価格 × 1.1 < 税込価格 + 1 となりますよね。たとえば税込価格54999円と仮定すると 54999 ≦ 本体価格 × 1.1 < 55000 です (55000はこの不等式が表す範囲に含まれないことに注意)。 したがって本体価格の範囲は | 税込価格 / 1.1 ≦ 本体価格 < (税込価格 + 1) / 1.1 となります。上の例で計算すると 49999.09.... ≦ 本体価格 < 50000 とならなければなりません。この条件を満たす整数の金額は**存在しません**。 つまりこの場合、「税込価格が54999円となるような本体価格が存在する」という仮定そのものが偽です。一方、たとえば税込価格54998円であれば本体価格49999円として不合理はありません。 ___ ついでに、 > 状況としては、先に税込価格の決定があってそれに応じたインボイスを発行する(レシートとか領収証とか)というシーンです。 そのような状況を想定することがそもそも非現実的だと思いますが、どうしてもやりたければ、端数処理のルールを工夫して目標の金額を出せるようにがんばるくらいしかないでしょう (当然ですが取引先や顧客にそのルールでの取引を認めてもらう必要がありますし、他であまり使われていないようなルールなら税務署にも相談したほうがいいと思います)。
guest

回答4

0

ここではなく、税務署にする質問ではないかと思いますが……。


まず、下記に消費税の計算のしかたが説明されています。

はじめのほうでは税務署に納付する消費税の税額の計算方法が説明されていますが、これは取引の際に取引相手に転嫁する消費税額の計算方法とは異なります。ご質問に関係あるのは後者で、あとのほうにある「適格請求書方式」の箇所で説明されています。これを参考にすると、消費税の計算方法は以下のようになりそうです。

  1. 税額の計算は、適格請求書(レシートなど) を発行する毎に計算する。
  2. 税率毎に区分して計算した対価の額を計算する。つまり、商品を標準税率(10%) と軽減税率(8%) に分けて各々の対価を合算する。
  3. 各々の対価の額に対して、税率に基づいた税額を計算する (商品ひとつずつについて計算するのではない)。各々に1円未満の端数が出たら端数処理をする (10%の分の端数と8%の分の端数を別々に処理する)。
  4. 両者の対価と端数処理後の税額をすべて合算する。

これで請求する税込金額が決まります。ですから、税込金額から逆算すれば本体価格を計算できます。

ただし、上記の端数処理の方法については「適格請求書の記載事項である消費税額等に1円未満の端数が生じる場合は、(中略) 切上げ、切捨て、四捨五入などの端数処理の方法については、任意の方法とすることができます。」(「端数計算」, 国税庁) とされています。ちょっと驚きますが、端数処理のやりかたは事業者が決めていいのです。逆算するにはその事業者がとっている端数処理の方法を知る必要があります。

もっとも、端数処理の方法がわかったとしても、税込価格と税率から本体価格を一意に求めることはできませんが。


なお、請求される税込金額は、販売時の価格表示の「総額表示」とは異なることに注意が必要です。総額表示は商品毎の単価に対して税込価格を表示しています (ちなみにこの場合も、1円未満の端数処理のしかたは事業者が決められます)。しかし、取引の際の消費税額は税率毎の対価の額をもとに計算されますから、個別の単価に対する税額を合算した結果と一致しないことがあります。総額表示はあくまでも目安だということですね。

そのため、価格表示の総額表示については1円未満での切り捨てや切り上げなどをせず、小数点以下まで表示している事業者もあります。

投稿2024/02/29 09:33

編集2024/02/29 10:00
ikedas

総合スコア4343

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

税込額として1円単位の任意の額を許容したいのであれば、それは1円単位の税抜額と一対一対応させられません

税込み11円は税抜き10円ですが、1円~11円の税込額11通りに対して、税抜額は1円~10円の10通りしかありません。どうしても「税込額は違うけど税抜額は同じ」と算出せざるを得ない場面が発生してしまいます。

投稿2024/02/29 12:17

maisumakun

総合スコア145186

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

状況としては、先に税込価格の決定があってそれに応じたインボイスを発行する(レシートとか領収証とか)というシーンです。

その状況設定が間違っています。
買い手との交渉、もしくは、マーケティングなどで、税込み価格を決めるのは問題ないですが、
実際の取引に当たっては、その価格から、税抜き価格を計算して(切り捨てでも切り上げでも自分で決める)、それを正式な税抜き価格として、その価格に対して消費税分(これも切り捨てでも切り上げでもいい)を足して、請求します。
買い手との交渉交渉もしくは、マーケティングで決めた税込み価格と一致しない可能性がありますが、そういうものです。
コンビニの8% 110円のコーヒーの税抜き価格は102円で、1つ買えば110円ですが、10個買うと1100円ではなくて1101円です。そういうものです。最近はクレームに対応するためか、110.16円と書いてありますね。

切り上げ切り捨て誤差を出すのがいやという事であれば、税率10%とすると、最初に決める税込み価格を11の倍数にしておく必要がありますね。

投稿2024/02/29 16:33

otn

総合スコア84618

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

誤差はでるものですが、そもそもrounddownしなければいいのでは?
54,999に対する消費税=ROUND(54999/11,0)→5,000
54,999-5,000=本体価格49,999

追記

商慣習的には伝票ごとに税計算しますが、税務的には総仕入額・総販売額をそれぞれに対して税率ごとに計算した税額を計算する必要があるため、個別の明細単位では49,999+5,000円でも50,000+4,999円でもどちらも正しく問題ありません。とはいえ明細での金額差が積み上がると誤差が大きくなりすぎるきらいがあるので、ピッタリ小数点端数が0.5で終わるものは銀行丸めという処理をかける場合があります。いろいろ試行錯誤してみてください

投稿2024/02/29 07:43

編集2024/03/01 00:10
yambejp

総合スコア114858

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問