分数が使われている場面

相続事件を進めていると、相続人の誰かが所有している土地の共有持分を他の相続人に分配する、というようなことが起こります。それも、単純に頭数で分割するというようなことばかりではなく、最終的な持分をきれいな数値にするため、中途半端な数値を操作するということもあります。

このような操作が間に入っているときなどにおいて、遺産分割の結果である持分の変動を正確に書き表すことができるのか、という問題が起こり得ます。

0.5や0.25など、有限小数の場合は問題ありません。しかし、0.333…や0.166…など、無限小数の場合は問題です。どこかで四捨五入をすると、実際の数値よりも大きくなったり、小さくなったりしてしまいます。すると、相続人全員の持分を合計しても1にならない、ということが起こってしまいます。これでは、権利関係が正確に表現されているとはいえません。

そのため、登記において持分は分数で表現されています。たとえば、0.333…ならば「3分の1」になり、0.166…ならば「6分の1」になります。これならば四捨五入も発生しないため、間違いのない数値を表現できます。

表計算ソフトの限界

Excelを使うと正しい数値が得られないケースを紹介します。

甲さんは、実家の土地について持分37800分の1787を有していました。相続が発生し、遺産分割協議の末、他の家族から持分を譲り受けることになり、甲さんは持分31395分の1787を所有することになりました。このとき、甲さんはどれくらいの持分を他の家族から譲り受けたのでしょうか。

これは、持分の差を計算するだけですので、「31395分の1787」から「37800分の1787」を引けばよいことになるのですが、Excelでは分数を直接扱うことができないため、計算式を使って小数にしてから引き算をすることになります。

31395分の1787
37800分の1787
31395分の1787から37800分の1787を引いた結果

Excelでは、表示形式として「分数」が用意されているのですが、標準の機能で用意されている桁数がとても少ないため(一般的な表計算で使われる範囲しか想定しておらず、厳密な計算を想定していない)、ユーザー定義の表示形式を使います。

ユーザー定義の表示形式で分数を表示する

しかし、この計算は間違っています。

31395分の1787-37800分の1787=1186731000分の67548600-1186731000分の56102865=1186731000分の11445735
1186731000と11445735の最大公約数は105なので、
1186731000÷105=11302200
11445735÷105=109007
より11302200分の109007が計算結果

分数の桁数を変えると結果も変わってくるのですが、やはり正しい値にはなりません。そもそも、適切な桁数を設定しなければ正解が表示されない、というのでは使いものになりません。

Rationalで正確な計算を

このような問題が生じるのは、分数を小数で表すとき、わずかな誤差が発生するためです。大きい数値では誤差が生じても気にならないのですが、数値自体がとても小さいとき、誤差は無視できなくなります。

そこで、小数を介さずに、分数のまま計算をする必要が生じてくるのです。

Rubyでは、Rationalというクラスが分数の機能を提供しています。四則演算も実装されているので、整数と同じように取り扱うことができます。

print <<END_OF_TEXT
31395分の1787 - 37800分の1787 を求めたい。
Excelでは
1787/31395 = 0.056919892 (Aとする)
1787/37800 = 0.047275132 (Bとする)
A - B = 0.009644759 = 9367/971201
となる。

Rubyの浮動小数点演算では
END_OF_TEXT

a = 1787.0 / 31395
b = 1787.0 / 37800

print <<END_OF_TEXT
A = #{sprintf("%f", a)}
B = #{sprintf("%f", b)}
A - B = #{sprintf("%f", a - b)}
となる。

RubyのRationalを使った計算では
END_OF_TEXT

a = Rational(1787, 31395)
b = Rational(1787, 37800)

print <<END_OF_TEXT
A = #{a}
B = #{b}
A - B = #{a - b}
となる。
END_OF_TEXT

この実行結果は、以下のとおりです。

31395分の1787 - 37800分の1787 を求めたい。
Excelでは
1787/31395 = 0.056919892 (Aとする)
1787/37800 = 0.047275132 (Bとする)
A - B = 0.009644759 = 9367/971201
となる。

Rubyの浮動小数点演算では
A = 0.056920
B = 0.047275
A - B = 0.009645
となる。

RubyのRationalを使った計算では
A = 1787/31395
B = 1787/37800
A - B = 109007/11302200
となる。

正しく計算することができました。