如何用Python3实现Java的Base64转MySQL DECIMAL(8,2)逻辑?
问题:将Java的Base64转DECIMAL逻辑转换为Python3代码
现有Base64编码字符串BzM=,对应正确值为18.43,该值来自MySQL数据库的DECIMAL(8,2)字段(字段定义为{'scale': '2', 'decimal.precision': '8'})。我经过大量研究仍未找到Python3的实现方案,以下是Java中的实现逻辑:
String encoded = "BzM="; int scale = 2; // 来自上述字段定义 final BigDecimal decoded = new BigDecimal(new BigInteger(Base64.getDecoder().decode(encoded)), scale); System.out.println("RES: " + decoded); // 输出 RES: 18.43
我尝试用反向推导的方式实现Python代码,但未成功:
import base64, struct x = base64.encodebytes(struct.pack('!f', 18.43)) print(x) # 输出 b'QZNwpA==\n',但预期结果是 BzM=
Python3 实现代码
import base64 from decimal import Decimal encoded = "BzM=" scale = 2 # 解码Base64字节串 decoded_bytes = base64.b64decode(encoded) # 将字节转换为有符号大整数(对应Java BigInteger的行为) integer_val = int.from_bytes(decoded_bytes, byteorder='big', signed=True) # 等价于Java中BigDecimal(BigInteger, scale):整数除以10^scale result = Decimal(integer_val) / (10 ** scale) print(f"RES: {result}") # 输出 RES: 18.43
逻辑说明
- Java的
new BigInteger(byte[])会把字节数组解析为大端字节序的有符号整数,Python用int.from_bytes(decoded_bytes, byteorder='big', signed=True)完全匹配该行为; - Java的
BigDecimal(BigInteger, scale)本质是将BigInteger的值除以10^scale,用Python的Decimal进行计算可以避免浮点数精度丢失,和Java的BigDecimal保持一致的精度表现。
内容的提问来源于stack exchange,提问作者Manuel Simões
相关产品推荐
相关产品推荐

