在Django模型中存储音视频时长:选FloatField还是DecimalField?
选DecimalField还是FloatField存音视频时长?
直接给结论:优先用DecimalField,原因如下:
- FloatField存在精度丢失问题:浮点型存储基于二进制,像1.2这类十进制小数没法被二进制精确表示,存入再读出可能变成1.1999999999999997。如果后续拿时长做计算(比如和你已用的credit字段算成本),误差会被放大,导致结果不准。
- DecimalField是精确小数存储:完全按十进制规则存储,不会有精度丢失问题,刚好匹配你用DecimalField存信用/成本的场景——后续用「时长×单价」计算成本时,两个Decimal类型直接运算,结果精确可靠。
具体实现建议
- 模型字段定义:
duration = models.DecimalField(max_digits=12, decimal_places=6)
- max_digits设12足够覆盖绝大多数场景:就算是100小时的视频,时长仅为360000秒,加上6位小数总位数也才12位;decimal_places设6能兼容ffmpeg返回的微秒级精度时长。
- 转换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
相关产品推荐
相关产品推荐

