odoo12 price unit 能否实现网页显示2位精度, 数据库实际存储6位小数

可以做到,而且是 Odoo 里非常常见的需求
前端界面显示 2 位小数,但数据库中保持 6 位精度存储 —— 不影响后台计算。

下面给你详细说明 三种可行方式,任选一种即可。


方案 1:修改字段 widget,只改变显示精度(推荐)

Odoo 12 的单价字段 price_unitfields.Float,其真实精度受 decimal.precision 控制。
如果你的数据库需要存 6 位小数,但界面只显示 2 位小数,你可以在 XML 视图中单独指定 widget:

XML 示例(只改变显示精度为 2 位)

<field name="price_unit" widget="float" options="{'precision': 2}"/>

✔ 结果

  • 界面显示:2 位精度,例如 105.12
  • 数据库存储:保持 6 位,例如 105.123456
  • 不会影响销售、库存等计算。

方案 2:修改 decimal.precision 配置(数据库精度维持不变,显示精度可独立设定)

Odoo 通过 decimal.precision 控制某些类别的显示精度,例如 Product Price
你可以把 Product Price 的显示精度改成 2 位,用于界面显示。

步骤:

  1. 打开 设置 → 技术 → 数据库结构 → 十进制精度(Decimal Precision)
  2. 找到 Product Price
  3. Digits 改为:2

✔ 结果

  • Odoo 界面所有价格显示都变成 2 位
  • 数据库字段仍然保存 6 位小数(不会被截断)

方案 3:保持后台精度 6 位(decimal.precision),但通过 round 显示

如果你只想控制界面某些位置显示 2 位,可以使用:

XML?

<field name="price_unit" widget="monetary" options="{'currency_field': 'currency_id'}"/>

货币 widget 会自动按货币精度显示(通常为 2 位)。


📌 重要说明:Odoo 12 的 Float 字段支持无限小数,只要 decimal.precision 设置够大

即使你显示 2 位,数据库依然可以存:

105.123456

只要 Product Price 的精度(decimal.precision)≥6。


🔍 总结

方案 显示精度 数据库存储精度 推荐度
修改视图 widget 2 6 ⭐⭐⭐⭐⭐ 最灵活,仅影响单个表单
修改 decimal precision 2 6 ⭐⭐⭐☆ 影响全局价格显示
使用 monetary widget 按货币精度(通常2位) 6 ⭐⭐⭐ 适合订单场景

如果你愿意,我还可以:

✅ 给你写完整的模块 override 代码
✅ 给你修改 sale.order.line 的专用视图
✅ 设置 price_unit 与 subtotal 都显示 2 位

你希望哪一种?

posted @ 2025-12-10 12:14  那时一个人  阅读(0)  评论(0)    收藏  举报