👌

丸め誤差の対策と対応(Typescript)

2023/10/09に公開

本記事ではjavascriptにおける丸め誤差とその対応についてまとめていく
はじめに、丸め誤差とは、長い桁や無限桁の小数を扱う際に、コンピュータが表現できる数の範囲(有効桁)を超えた場合に「四捨五入」や「切り上げ」「切り捨て」などを行い有効桁以降の値を捨てることにより生じる誤差のことである。

実際の例

実際は0.7になって欲しいにも関わらず0.7000000000000001という値になってしまっていることがわかる
altテキスト

対応策

丸め誤差の対応策としてライブラリを使用する方法もあるのだが、今回とった対応策としては元々Number型であった数字をBigIntで扱い整数部分と少数部分で計算を行いNumberに戻した後、たし合わせる方法をとった

実際のコード

export const unitCalculation = (val: number, div_number: number): number => {
  // 整数部分計算
  // 除算を行い、さらに1000で除算して元のスケールに戻す
  const resultBigInt = (BigInt(val) * BigInt(1000)) / BigInt(div_number);
  const scaledResult = resultBigInt / BigInt(1000);
  const calculatedInt = Number(scaledResult);

  // 小数部分計算
  const calculatedDecimal = Number(resultBigInt % BigInt(1000)) / 1000;

  return calculatedInt + calculatedDecimal;
};

ライブラリ紹介

丸め誤差の他の対応策としてライブラリを使用するという方法もあるのでいくつかリンクを貼っておくので参考にしていただけたらと思います。

https://npmtrends.com/big.js-vs-bignumber.js-vs-decimal.js-vs-mathjs-vs-numeraljs

https://github.com/MikeMcl/big.js
https://github.com/MikeMcl/bignumber.js/
https://github.com/MikeMcl/decimal.js/

参考記事

https://medium-company.com/丸め誤差/
https://qiita.com/akebi_mh/items/0006d11887fe1a39345f

Discussion