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

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 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]

以上是 python 对mysql Decimal类型字段做小数操作的问题 的全部内容, 来源链接: utcz.com/a/157465.html

回到顶部