python

数据库中字段类型为bigint,值为1,除以100后读取出来,打印显示:Decimal('0.01')

和数字0.01比较,断言不通过

学习以下decimal相关知识:

#1.可以传递给Decimal整型或者字符串参数,但不能是浮点数据,因为浮点数据本身就不准确。
data = Decimal(1)  # 1
data = Decimal(0.01)  # 0.01000000000000000020816681711721685132943093776702880859375

#2.从浮点数据转换为Decimal类型
data = Decimal.from_float(12.222)  # 12.2219999999999995310417943983338773250579833984375

#3.限定5位有效数字
getcontext().prec = 5
data = 1/7  # 0.14285714285714285
data = Decimal(1)/Decimal(7)  # 0.14286(四舍五入)
data = Decimal(100)/Decimal(7)  # 14.286

#4.四舍五入,保留2位小数
data = Decimal('50.5679').quantize(Decimal('0.00'))  # 50.57
data = Decimal(1/100).quantize(Decimal('0.00'))  # 0.01

#5. Decimal转化为string类型
data = str(Decimal('3.457').quantize(Decimal('0.00')))  # 3.46

几种断言:

self.assertEqual(0.01, Decimal(0.01))   # 通过
self.assertEqual(0.01, Decimal('0.01'))  # 不通过
        
self.assertEqual('0.0', '0.00')  # 不通过
        
self.assertEqual('0.01', '0.01')  # 通过(字符串和字符串)
self.assertEqual(0.01, 0.01)      # 通过(数字和数字)
self.assertEqual(0.01, '0.01')    # 不通过(数字和字符串)

以上为纯知识,未解决实际问题。。。

最后,

解决方案一:数据库中读取的数字不除以100,需断言比较的数字乘以100,可以解决

解决方案二:换读取数据库方法,使用pandas,打印字典类型,可以解决

解决方案三:转成字符串,因存在0.0,0.00这种,较麻烦,未尝试,理论上应该可以

ps:

使用pandas读取数据库:

import pymysql  # 或import MySQLdb
import pandas as pd


def pdsql(sql):
    # 使用pandas操作数据库
    db = pymysql.connect('192.168.3.77', 'user', 'passwd', 'db_name', charset='utf8')
    res = pd.read_sql(sql, db)  # 以DataFrame方式读取数据库

    res = res.to_dict('records')
    print(res)  # 打印字典类型 [{'订单金额': 1.0,'下单时间': '2020-12-08 19:50:35'}]
    db.close()
    return res
原文地址:https://www.cnblogs.com/xiaochongc/p/14930675.html