2017-09-13 94 views
1
worth = Decimal(request.POST.get('worth')) 
print(request.user.profile.cash) # -> prints 10000.000000000000000 
print(worth) # -> prints 10000 
Profile.objects.filter(user=request.user).update(cash=F('cash')-worth) 
request.user.profile.refresh_from_db() 
if request.user.profile.cash < 0: 
    ###!!!!#### 
    print(request.user.profile.cash) # -> -1.819E-12 

#model definition: 
class Profile(models.Model): 
    cash = models.DecimalField(default=10000, max_digits=30, decimal_places=15) 

可以看出,玩家有10k现金,我减去10k,这会导致负值,我该如何解决这个问题?我不会让现金成为负数,因为你可以预期。我在做主要错误的事情吗?Django十进制精度损失

我希望玩家能够用他的钱全押。

+0

什么是'user.profile.cash'? –

+0

也许'F()'表达式将小数转换为浮点数?值“-1.1819E-12”是一个浮点数。 –

+0

您使用的是哪个数据库后端?这可能是一个特定于数据库的问题。例如,SQLlite没有原生的十进制字段。 Django必须在那里使用一些解决方法。 –

回答

1

您可能可以通过从python中减去现金(即不使用数据库查询)来解决此问题。我很确定你必须首先将价值转换为Decimal值才能做到这一点。这可能起作用的原因是Django使用decimal模块中的Decimal值来进行具有十进制数字的完美精度的十进制字段值的算术运算。我不确定你的数据库在做这个查询时做了什么,但它必须涉及某种浮点数学。您看到的值基本上等于零(-0.000000000001819),但包含一些浮点错误。