简单的乘法和除法非常不准确

问题描述 投票:0回答:2

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的新手,因此解决此问题的方法可能非常简单,但我无法弄清楚。

python encoding division multiplication decoding
2个回答
1
投票

float除法(/)并非任意精确。但是[int除法(//)!

尝试一下:

assert 370190160220170180330190140310320 == 370190160220170180330190140310320 // 1
assert 370190160220170180330190140310320 != 370190160220170180330190140310320 / 1

对于您正在做的事情,您可能想使用//%而不是/


-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
© www.soinside.com 2019 - 2024. All rights reserved.