0
1

More than 5 years have passed since last update.

javascriptで設定できない税込価格を求める(その方法の検討)

Posted at

設定できない税込価格

税込価格は一般的に、税抜価格*(1+税率)の小数点以下切り捨てになると思います。
この計算方法だと、例えば税率8%では税込価格13円は設定できません。無駄に忌み数。

Math.floor(12 * 1.08)
// 12
Math.floor(13 * 1.08)
// 14

なので、そういった数をどーしても税込価格にしたい場合は特別な配慮が必要になります。桁丸め方法を変えると別の数が使えなくなるので、統一するのも難しい。

自分はDBに入れる時に税抜き額と税額を入れるようにしました。一応逆算もできるし、桁丸め方法も求めることはできる。入力は税抜きでも税込みでも、DBに入れる前に計算して出してやればいいので。

まぁこういうのがどれくらいあって、どれくらい使いそうな数字で出てくるか気になったので出してみることにしました。

コード

以下をchromeのコンソールに入れて呼び出す。

getInvalidIncludeTaxPrices = (taxRate=1.08, i=1, max=100000, interval=1000) => {
    n = Math.floor(i*taxRate)
    array = []
    while(n < max){
        i = i + 1
        m = Math.floor(i*taxRate)
        b = m - n > 1 && (m-1) % interval === 0
        n = m

        if(b){
            array.push(m-1)
        }
    }
    return array
}

結果

getInvalidIncludeTaxPrices()
// [13000, 26000, 40000, 53000, 67000, 80000, 94000]

消費増税

getInvalidIncludeTaxPrices(1.1, 1, 100, 1)
// [10, 21, 32, 43, 54, 65, 76, 87, 98]

うまい棒どうすんのか気になります。
あと法則性もありそうな。数列として式に書けるんだろうか……。

もう少しうまく書けないか

arrow functions と default parameters を使えてホクホクといった感じですが……
とりあえず普通のfor文は使ってなさすぎて書式を忘れた。do-whileは合いそうな気もしますがまぁやらないとします。

再帰で書けないか

まず再帰で書けないかと反射的に思いますが、回数的にStackOverflowになるのが見える。
末尾再帰最適化があればいいんですが

末尾再帰による最適化 - Qiita

まだブラウザが対応してないらしい。

関数型っぽく書けないか

Range(1,100).map(() => {...})みたいなの。今っぽい。フリーランチが終わって結構経つしマルチスレッドでパラレルだ!
しかしながら、これは昨日書いた通り最初に全部展開してしまうため、判定する数が多くなってくるとメモリを大食いしそうに見えます。

javascript iteratorのnext呼び出しタイミング - Qiita

結局普通のfor文じゃないかという感じになりました。

じゃあまぁ普通のwhileでいいかな。

chromeのconsoleが便利

ES6のおかげで色々楽に書けるようになっています。ちょっとした処理をするのに便利。ブラウザがあれば
Googleスプレッドシートとかでも同じ物を求められますが、ちょっとめんどくさそう。
javascriptならGASも使えるし、ポテンシャルあるなぁと改めて思いました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1