擅长:python、mysql、java
<p>考虑到你在这里关心的只是数量的减少,你是否考虑过仅仅用<code>Decimal</code>表示数字,然后用科学记数法打印它们?你知道吗</p>
<pre><code>from decimal import Decimal
nums = {Decimal(1000000), Decimal(20000000), Decimal(1234000), Decimal(1200000)}
print({str(num.normalize()) for num in nums})
# {'1E+6', '1.2E+6', '2E+7', '1.234E+6'}
</code></pre>
<hr/>
<p>如果这对于您的用例来说不合理,那么您可以做的另一件事就是确定您可以减少的最大幅度,然后再减少那么多。对于震级为10的情况,这相当简单,您可以使用字符串:</p>
<pre><code>nums = {1000000, 20000000, 1234000, 1200000}
div_factor = 10 ** min(len(str(num)) - len(str(num).rstrip('0')) for num in nums)
reduced_nums = {num / div_factor for num in nums}
# {1000.0, 1234.0, 20000.0, 1200.0}
# you can use integer division `//` instead of true division `/` if you want
</code></pre>
<p>对于非标准震级(例如震级为3),你需要更具创造性,想出一种方法来有效地计算出你能除以的最大震级。我上面的例子在这里采用了一种快捷方式,即检查当我们去掉尾随的零时有多少数字消失了(这相当于检查10的最大指数,它可以是整数除以数字)。由于python没有内置的方法来打印不是2、8、10或16的基,因此您必须找到自己的解决方案。你知道吗</p>