You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Django模型中存储音视频时长:选FloatField还是DecimalField?

选DecimalField还是FloatField存音视频时长?

直接给结论:优先用DecimalField,原因如下:

  • FloatField存在精度丢失问题:浮点型存储基于二进制,像1.2这类十进制小数没法被二进制精确表示,存入再读出可能变成1.1999999999999997。如果后续拿时长做计算(比如和你已用的credit字段算成本),误差会被放大,导致结果不准。
  • DecimalField是精确小数存储:完全按十进制规则存储,不会有精度丢失问题,刚好匹配你用DecimalField存信用/成本的场景——后续用「时长×单价」计算成本时,两个Decimal类型直接运算,结果精确可靠。

具体实现建议

  1. 模型字段定义:
duration = models.DecimalField(max_digits=12, decimal_places=6)
  • max_digits设12足够覆盖绝大多数场景:就算是100小时的视频,时长仅为360000秒,加上6位小数总位数也才12位;decimal_places设6能兼容ffmpeg返回的微秒级精度时长。
  1. 转换float为Decimal:
    直接转float到Decimal仍可能带精度问题,建议先转字符串再转Decimal:
from decimal import Decimal

# 从ffmpeg获取的float类型时长
duration_float = float(ffmpeg.probe(audio_path)["format"]["duration"])
# 转换为Decimal后存入数据库
duration_decimal = Decimal(str(duration_float))

内容的提问来源于stack exchange,提问作者tthheemmaannii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 12:04:54