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
回答:
#!/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 randintdef 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]
以上是 python 对mysql Decimal类型字段做小数操作的问题 的全部内容, 来源链接: utcz.com/a/157465.html