我正在尝试创建一个精确的十进制数字类型。我把它存储为有理p/q
,其中q
总是10的幂。
现在,如果我试图对其中一个数字进行除法,我需要看看结果是否可以表示为有限的十进制展开。例如,10.2 / 80 => 0.1275
可以,但10 / 3 = 3.333...
不可以。
它可以归结为看一个整数q
,然后问:是否有一个整数m
使得:
q * m = 10 ^ n (q, m, n are all integers)
我可以写一个循环来搜索它,测试n=0,1,2,3,。。。?但是还有更直接的方法吗?我不知道如何用代数方法解那个小方程。
首先,你需要看看q是否可以写成2s和5s的乘积;如果可以的话,m和n将有一个整数解。否则,就不会有.
我们可以找到整数a、b和c,使得q=(2^a((5^b(c和c不能被2或5整除。只要q仍然可以被2整除,就可以反复将q除以2,每次递增a;然后,除以5并增加b,只要q仍然可以被5整除;那么,c将是在这个重复除以2和5的过程之后q的值剩下的任何值。
在这一点上,如果c=1,我们可以找到一个解决方案;否则,就没有整数m有效。假设c=1,检查a和b:
- 如果a=b,q已经是10的幂;选择m=1
- 如果<b、 选择m=2^(b-a(
- 如果a>b、 选择m=5^(a-b(