擅长:python、mysql、java
<p>对于这个特殊的问题,<code>decimal</code>是一个很好的方法,因为它将十进制数字存储为元组!</p>
<pre><code>>>> a = decimal.Decimal(9999999998)
>>> a.as_tuple()
DecimalTuple(sign=0, digits=(9, 9, 9, 9, 9, 9, 9, 9, 9, 8), exponent=0)
</code></pre>
<p>因为您正在寻找一个最自然地用十进制表示法表示的属性,所以使用二进制表示法有点傻。你链接到的维基百科页面没有指明在“嫁接数字”开始之前可能出现多少个“非嫁接数字”,因此可以指定:</p>
<pre><code>>>> def isGrafting(dec, max_offset=5):
... dec_digits = dec.as_tuple().digits
... sqrt_digits = dec.sqrt().as_tuple().digits
... windows = [sqrt_digits[o:o + len(dec_digits)] for o in range(max_offset)]
... return dec_digits in windows
...
>>> isGrafting(decimal.Decimal(9999999998))
True
>>> isGrafting(decimal.Decimal(77))
True
</code></pre>
<p>我认为<code>Decimal.sqrt()</code>的结果很有可能比<code>math.sqrt()</code>的结果更准确,至少在这方面,因为二进制表示和十进制表示之间的转换。例如,请考虑以下内容:</p>
<pre><code>>>> num = decimal.Decimal(1) / decimal.Decimal(7)
>>> decimal.Decimal(math.sqrt(num) ** 2) * 7
Decimal('0.9999999999999997501998194593')
>>> decimal.Decimal(num.sqrt() ** 2) * 7
Decimal('1.000000000000000000000000000')
</code></pre>