blog金額計算で小数点誤差のない計算を行えるDartのパッケージのrationalの実装を見てみる2023-04-02by@wapa5pow金額計算を行うときにdoubleやflootで金額を扱うと小数点誤差が出ることがあります。浮動小数点数は、内部的に2進数で表現されているため、10進数での計算結果と異なることがあるためです。以下のようにa=0.1、b=0.2とした場合、sumは0.30000000000000004となります。1}ChatGPTに、この誤差を防ぐためのパッケージを各種プログラミング言語でどうすればいいか聞いたら以下のように教えてくれました。Rational(標準ライブラリ)今回はDartのrationalパッケージの実装を見ていきます。rationalパッケージの実装rational.dartを見ればいいのですが特徴的なところだけ紹介します。分子・分母でそれぞれBigIntで定義して値を保持するrationalは英語で有理数という意味です。有理数は整数か分数の形で表せる数の総称です。パッケージ内のRationalクラスはnumerator(分子)とdenominator(分母)を以下のように定義してフィールドとして持っています。intで持つと桁数が限られてしまうので、BigIntで持っています。BigIntで持てばメモリが許す限りの桁を保持できます。denominator;Rational同士の足し算は以下のように定義されています。小学校などで習う通分そのままに計算しています。);約分する上記のまま掛け算をしていくと分子・分母が大きくなり過ぎてしまうのでコンストラクタでちゃんと約分しています。Divisor、最大公約数)は、2つの整数の最大の共通の約数を出すので分子・分母を約数で割ればそれぞれを小さくできます。}まとめDartでは浮動小数点誤差をなくすためにはrationalパッケージを使えばいいです。rationalパッケージは分子・分母という形でそれぞれBigIntで値を保持し、約分しながら各種計算を行なっています。誤差をなくして安全な金額計算などをこれからもできるといいですね。blogHomeAboutTool。