python 对mysql Decimal类型字段做小数操作的问题

例出一个变量x(decimal类型,小数点后两位)
我如何做到,
1.当变量大于50时,返回值是减去0.1-0.9(随机性取这个区间的值),结果要是小数点后两位的数
2.当变量大于30,小于50时,返回值是减去0.1-0.5(随机性取这个区间的值),结果要是小数点后两位的数
3.当变量大于0,小于30时,返回值是减去0.1-0.3(随机性取这个区间的值),结果要是小数点后两位的数

举例说明:
比如x=60.55
它属于第一种类型,大于50,60.55-随机值为0.3=60.25

阅读 4k
2 个回答
#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""

author:     HelloGitHub
date:       2019/7/29
description: python 对mysql Decimal类型字段做小数操作的问题

例出一个变量x(decimal类型,小数点后两位)
我如何做到,
1.当变量大于50时,返回值是减去0.1-0.9(随机性取这个区间的值),结果要是小数点后两位的数
2.当变量大于30,小于50时,返回值是减去0.1-0.5(随机性取这个区间的值),结果要是小数点后两位的数
3.当变量大于0,小于30时,返回值是减去0.1-0.3(随机性取这个区间的值),结果要是小数点后两位的数

举例说明:
比如x=60.55
它属于第一种类型,大于50,60.55-随机值为0.3=60.25
"""
import random


def process_decimal(raw_number):
    if raw_number is None or raw_number == '':
        return None
    float_number = float(raw_number)
    if float_number > 50:
        random_number = random.randrange(1, 90) / 100.0
        float_number = float_number - random_number
    elif 30 < float_number < 50:
        random_number = random.randrange(1, 50) / 100.0
        float_number = float_number - random_number
    elif 0 < float_number < 30:
        random_number = random.randrange(1, 30) / 100.0
        float_number = float_number - random_number
    return round(float_number, 2)

提问应该把来龙动脉讲清楚
1、是什么表,表里有些什么字段
2、是希望直接通过sql来直接实现,还是通过orm来实现
3、只有大于50和小于50,没有提到等于50的情况(这条可以忽略或许本身需求就是这样的)

那就几种实现情况都说一下
一、通过sql直接实现,以mysql为例

create table test(
    number int
);

insert into test values(60),(40),(20);


select
    number,
    case
        when number>50 then round(number-(rand()*0.8+0.1), 2)
        when 30<number<50 then round(number-(rand()*0.4+0.1), 2)
        when 0<number<30 then round(number-(rand()*0.2+0.1), 2)
    end as x
from
    test

二、在orm里实现(假设model名是Test,要查询出来的字段名是x)

case_sql = """
    case
        when number>50 then round(number-(rand()*0.8+0.1), 2)
        when 30<number<50 then round(number-(rand()*0.4+0.1), 2)
        when 0<number<30 then round(number-(rand()*0.2+0.1), 2)
    end
"""

tests = Test.objects.all().extra(
    select={'x': case_sql}
)

三、遍历orm结果转换

from random import randint

def convert(number):
    stop = 0
    if number > 50:
        stop = 90
    elif 30 < number < 50:
        stop = 50
    elif 0 < number < 30:
        stop = 30

    return round(number - randint(10, stop) / 100.0, 2)


lst = [20, 40, 60]
print [convert(_) for _ in lst]

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题