【问题标题】:unsupported operand type(s) for -: 'decimal.Decimal' and 'float' | Django [duplicate]- 不支持的操作数类型:'decimal.Decimal' 和 'float' | Django [重复]
【发布时间】:2021-11-24 02:10:11
【问题描述】:

有时它可以正常工作,有时它会显示错误。

管理员

models.py

class BarterAdminWallet(models.Model):
    admin_wallet_id = models.BigAutoField(primary_key=True)
    admin_wallet_balance = models.DecimalField(max_digits=60, decimal_places=2, default = 0.00)
    admin_tokens_assigned = models.DecimalField(max_digits=60, decimal_places=2, default = 0.00)
    admin_tokens_earned = models.DecimalField(max_digits=60, decimal_places=2, default = 0.00)
    admin_tokens_bought = models.DecimalField(max_digits=60, decimal_places=2, default = 0.00)


class BarterAdminActionsTokens(models.Model):
    action_tokens_id = models.BigAutoField(primary_key=True)
    account_activation_tokens = models.DecimalField(max_digits=30, decimal_places=2, default = 0.00)
    newsletter_subscription_tokens = models.DecimalField(max_digits=30, decimal_places=2, default = 0.00)
    name_tokens = models.DecimalField(max_digits=30, decimal_places=2, default = 0.00)
    surname_tokens = models.DecimalField(max_digits=30, decimal_places=2, default = 0.00)
    add_languages_tokens = models.DecimalField(max_digits=30, decimal_places=2, default = 0.00)
    mobile_phone_tokens = models.DecimalField(max_digits=30, decimal_places=2, default = 0.00)
    avatar_image_tokens = models.DecimalField(max_digits=30, decimal_places=2, default = 0.00)
    profile_description_tokens = models.DecimalField(max_digits=30, decimal_places=2, default = 0.00)
    dob_tokens = models.DecimalField(max_digits=30, decimal_places=2, default = 0.00)
    linkedin_profile_tokens = models.DecimalField(max_digits=30, decimal_places=2, default = 0.00)
    facebook_profile_tokens = models.DecimalField(max_digits=30, decimal_places=2, default = 0.00)
    address_1_tokens = models.DecimalField(max_digits=30, decimal_places=2, default = 0.00)
    address_2_tokens = models.DecimalField(max_digits=30, decimal_places=2, default = 0.00)

用户

views.py

   adminwallet = BarterAdminActionsTokens.objects.get()
   registration_tokens = adminwallet.account_activation_tokens

   adminwallet = BarterAdminWallet.objects.get()
   adminwallet.admin_wallet_balance = adminwallet.admin_wallet_balance - float(registration_tokens)
   adminwallet.admin_tokens_assigned = adminwallet.admin_tokens_assigned + float(registration_tokens)
   adminwallet.save()

   token_status.user_account_activation_token_status = "Awarded"
   token_status.save()

代码说明

  • 所有与数学相关的字段都是小数。
  • 相同的代码,在计算时有时会完美计算并在某些情况下显示错误。
  • 此外,此代码在其他应用程序中运行良好。

【问题讨论】:

  • registration_tokens 不是已经是Decimal 了吗?为什么要在计算之前进行类型转换?
  • 我试过了,但没有成功。
  • 让我试试
  • 它工作我不应该改变它然后为什么它发生在开始

标签: python python-3.x django django-models typeerror


【解决方案1】:

正如@Abdul Aziz 指出的那样,这个问题应该可以解决问题。

您正在添加floatdecimal.Decimal(),它们可能看起来相似,但非常不同。

float 为您提供您声明的数字的近似值。例如,如果您打印 0.2 后有 12 个小数位,您实际上得到的不是 0.2,而是一个近似值。

另一方面,小数提供精度,而小数可能会遇到其自身的精度问题,但通常小数比浮点数更精确。

   adminwallet.admin_wallet_balance = adminwallet.admin_wallet_balance - registration_tokens
   adminwallet.admin_tokens_assigned = adminwallet.admin_tokens_assigned + registration_tokens

单独做这件事就足够了。

文档:https://docs.python.org/3/library/decimal.html

【讨论】:

  • 如果您同意链接的问题解决了问题,请不要添加答案。如果您有更好的答案,请将其发布在该重复目标上。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
  • 2022-08-22
  • 1970-01-01
  • 2013-05-08
相关资源
最近更新 更多