JavaScriptで消費税計算の場合はtrunkで切り捨てで良い

JavaScriptで消費税計算

JavaScriptで飲食店の税込価格の関数を作成する場合は、テイクアウトとイートインでは消費税が8%と10%で異なるため、以下のように引数にisEatInのようなboolean値を用意して税率を帰る必要があります。

JavaScript
function calcPrice(price, isEatIn) {
  const TAX_RATE = isEatIn ? 1.1 : 1.08
  return price * TAX_RATE
}

しかし、これだとJavaScriptの場合は丸め誤差が発生してしまいます。

JavaScript
function calcPrice(price, isEatIn) {
  const TAX_RATE = isEatIn ? 1.1 : 1.08
  return price * TAX_RATE
}

console.log(calcPrice(105, false)) // 113.4
console.log(calcPrice(205, false)) // 221.4
console.log(calcPrice(305, false)) // 329.40000000000003

console.log(calcPrice(1000, true)) // 1100
console.log(calcPrice(2000, true)) // 2200
console.log(calcPrice(3000, true)) // 3300.0000000000005

さらに価格の場合は小数点以下は切り落としになります。

そのため、単純な税込価格の計算の際は小数点以下をtrunkメソッドで切り落とす必要があります。

JavaScript
function calcPrice(price, isEatIn) {
  const TAX_RATE = isEatIn ? 1.1 : 1.08
  return Math.trunc(price * TAX_RATE)
}

console.log(calcPrice(105, false)) // 113
console.log(calcPrice(205, false)) // 221
console.log(calcPrice(305, false)) // 329

console.log(calcPrice(1000, true)) // 1100
console.log(calcPrice(2000, true)) // 2200
console.log(calcPrice(3000, true)) // 3300

Math.round()を使用してはいけない

たまにこの手の計算でMath.round()を使用する人がいるのですが、Math.round()だと四捨五入となってしまうので税込価格の計算に使ってはいけません。

TypeScript
function calcPrice(price: number, isEatIn: boolean) {
  const TAX_RATE = isEatIn ? 1.1 : 1.08
  return Math.round(price * TAX_RATE)
}

// Math.round()だと税込価格が1円高くなる
console.log(calcPrice(105, true)) // 116
console.log(calcPrice(205, true)) // 226
console.log(calcPrice(305, true)) // 336

ChatGPTなどのAIだと、税込価格の小数点以下は切り捨てだと知らずにMath.round()を使用することがあるので注意が必要です。

big.jsやdecimal.jsは不要

丸め誤差が発生しないように計算できるbig.jsやdecimal.jsなどのJavaScriptライブラリがありますが、これらのライブラリを使用すると計算式がわかりづらくなります。

そもそも単純な税込価格の計算程度であればtrunkによる小数点切り捨てで十分なので、これらのライブラリを使う必要はありません。