Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django无法将浮点转换为十进制。首先将浮点值转换为字符串_Django - Fatal编程技术网

Django无法将浮点转换为十进制。首先将浮点值转换为字符串

Django无法将浮点转换为十进制。首先将浮点值转换为字符串,django,Django,我有一个模型,当你上传一张图片时,它会自动调整图片的大小并保存原稿 问题是,当我在管理面板上保存图像时,我得到了这个错误 无法将浮点转换为十进制。首先将浮点值转换为字符串 File "C:\o\mysite\fruit\models.py" in save 61. super(Pic, self).save(*args, **kwargs) File "C:\Python26\lib\decimal.py" in __new__ 652.

我有一个模型,当你上传一张图片时,它会自动调整图片的大小并保存原稿

问题是,当我在管理面板上保存图像时,我得到了这个错误

无法将浮点转换为十进制。首先将浮点值转换为字符串

File "C:\o\mysite\fruit\models.py" in save
 61.         super(Pic, self).save(*args, **kwargs)
 File "C:\Python26\lib\decimal.py" in __new__
  652.                             "First convert the float to a string")

Exception Type: TypeError at /admin/fruit/pic/add/
Exception Value: Cannot convert float to Decimal.  First convert the float to a string
我只是不明白为什么会出现这个错误

我的模特

class Pic(models.Model):
    user = models.ForeignKey(User)
    image = models.ImageField(
        upload_to="image",
        blank=True
        )
    descrip = models.TextField()
    ratio = models.DecimalField(decimal_places=5,max_digits=10,default=0)

    def __unicode__(self):
        return self.descrip

    def original(self):
        width = self.image.width / float(self.ratio)
        height = self.image.height / float(self.ratio)

        result = "<img src='/media/{0}' height='{1}' width='{2}'>".format(
            self.image, height, width)

    return result

    def save(self, *args, **kwargs):       
        pw = self.image.width
        ph = self.image.height
        mw = 200
        mh = 200

        self.ratio = getWH(pw, ph, mw, mh, 'r')

        super(Pic, self).save(*args, **kwargs)

        if (pw > mw) or (ph > mh):
            filename = str(self.image.path)
            imageObj = img.open(filename)

            ratio = 1

            if (pw > mw):
                ratio = mw / float(pw)
                pw = mw
                ph = int(math.floor(float(ph)* ratio))
            if ( ph > mh):
                ratio = ratio * ( mh /float(ph))
                ph = mh
                pw = int(math.floor(float(ph)* ratio))

            width = getWH(pw, ph, mw, mh, 'w')
            height = getWH(pw, ph, mw, mh, 'h')

            imageObj = imageObj.resize((width, height),img.ANTIALIAS)
            imageObj.save(filename)



def getWH(pw, ph, mw, mh, result):
    ratio = 1

    if (pw > mw):
        ratio = mw / float(pw)
        pw = mw
        ph = int(math.floor(float(ph)* ratio))
    if ( ph > mh):
        ratio = ratio * ( mh /float(ph))
        ph = mh
        pw = int(math.floor(float(ph)* ratio))

    if result == 'w':
        return pw
    elif result == 'h':
        return ph
    else:
        return ratio
classpic(models.Model):
user=models.ForeignKey(用户)
image=models.ImageField(
上传到=“图像”,
空白=真
)
descripp=models.TextField()
比率=型号。小数字段(小数位数=5,最大位数=10,默认值=0)
def ___; unicode(自):
返回自我描述
def原件(自身):
宽度=self.image.width/float(自身比率)
高度=自映像高度/浮动(自映像比率)
结果=”.格式(
自我形象、高度、宽度)
返回结果
def保存(自身、*args、**kwargs):
pw=self.image.width
ph=自我形象高度
兆瓦=200
mh=200
自身比率=getWH(pw、ph、mw、mh,‘r’)
超级(图片,自我)。保存(*args,**kwargs)
如果(pw>mw)或(ph>mh):
filename=str(self.image.path)
imageObj=img.open(文件名)
比率=1
如果(pw>mw):
比值=mw/浮子(pw)
pw=mw
ph=int(数学下限(浮动(ph)*比率))
如果(ph>mh):
比率=比率*(mh/浮子(ph))
ph=mh
pw=int(数学下限(浮动(ph)*比率))
宽度=getWH(pw,ph,mw,mh,'w')
高度=getWH(pw、ph、mw、mh、h)
imageObj=imageObj.resize((宽度、高度),img.ANTIALIAS)
imageObj.save(文件名)
def GETW(pw、ph、mw、mh、结果):
比率=1
如果(pw>mw):
比值=mw/浮子(pw)
pw=mw
ph=int(数学下限(浮动(ph)*比率))
如果(ph>mh):
比率=比率*(mh/浮子(ph))
ph=mh
pw=int(数学下限(浮动(ph)*比率))
如果结果==“w”:
返回pw
elif结果==“h”:
返回ph值
其他:
回报率

来自官方文件

为什么模块中不包括float_to_decimal()例程

有一个问题是混合二进制是否可取 和十进制浮点。此外,它的使用需要一些谨慎,以避免 与二进制浮点相关的表示问题:

顺便说一下,您可以在给定的链接中找到答案:

def float_to_decimal(f):
    "Convert a floating point number to a Decimal with no loss of information"
    n, d = f.as_integer_ratio()
    numerator, denominator = Decimal(n), Decimal(d)
    ctx = Context(prec=60)
    result = ctx.divide(numerator, denominator)
    while ctx.flags[Inexact]:
        ctx.flags[Inexact] = False
        ctx.prec *= 2
        result = ctx.divide(numerator, denominator)
    return result
python 2.7中已经包含了此功能。

使用python 2.7+:

from decimal import Decimal
Decimal.from_float(234.234)