2017-09-13 152 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),但包含一些浮點錯誤。