tldr:公式x /(1 * 1)减去数百万亿。为什么?
大家好!我是python的新手,从头开始制作python消息加密器时,(我知道,有更简单的方法来制作消息编码器。我只是为了体验和娱乐而已)非常简单的乘法和除法问题似乎非常不准确。基本上,我的编码器的工作原理是将输入字符串中的所有字符转换为数字,然后将数字乘以两个单独的用户提供的键。我一直在测试所有键设置为1的情况,编码工作正常;解码是个问题。我的公式是:
编码:
String = String * Key1 * Key2 #Both keys are set to 1
解码:
String = String / (Key1 * Key2) #Again, both keys are set to 1, so in theory it should just spit the string back out.
当我输入370190160220170180330190140310320时,得到370190160220170177177212212337088。
370190160220170180330190140310320
370190160220170177391212613337088
因此,等价于x /(1 * 1)的公式显然意味着减去了许多四分位数。这里发生了什么?就像我说的那样,我是python的新手,因此解决此问题的方法可能非常简单,但我无法弄清楚。
float
除法(/
)并非任意精确。但是[int
除法(//
)!
尝试一下:
assert 370190160220170180330190140310320 == 370190160220170180330190140310320 // 1
assert 370190160220170180330190140310320 != 370190160220170180330190140310320 / 1
对于您正在做的事情,您可能想使用//
和%
而不是/
!
您需要使用Decimal
来精确地拟合较大的数字,并且需要将精度更改为大于默认值28。
from decimal import Decimal
x = Decimal(370190160220170180330190140310320)
print(x == (x/(1*1))) # False
from decimal import Decimal, getcontext
getcontext().prec = 40
x = Decimal(370190160220170180330190140310320)
print(x == (x/(1*1))) # True