c++ float 保留两位小数_odoo小数精确度

python round() 函数

Python用于四舍五入的内建函数round() ,它的定义为

d3ee62ef138a45d88eb3565f1c127164

意思是, 将 小数部分保留到 ndigits 指定的 小数位,也就是 精度保持到 ndigits -1 位; 如果没有 指定 ndigits ,则 精度 保持到 整数位。

例如

2b2934ae312e4bc98493e43827cbf20d

n = 5.11965811966 直接 round 时, 精确度 为整数, 即 5.0 ; round(n, 5)时,小数位保留 5位,即 5.11966

odoo小数位数设置

在 odoo中,各业务模块设置了各自的精确度, 通过 模型 decimal.precision 定义 用于不同用途的 精确度【小数位数】, dp 模型 根据 name 返回 小数位数, 默认为 2位

常用的精确度用途如下

192540012dca4f0ebc945756dc1c7448

在定义模型的字段时, 通过 Fileds.float() 的属性 digits_compute 设置 小数位数, 例如

price_unit = fields.Float(string='Unit Price', required=True, digits=dp.get_precision('Product Price'))

通过 dp 类的方法 get_precision 读取 名为 product price 的精确度, 在此例, 读取的值 应是 3, 所以 采购单价 为 3位 小数位

edeeaabfb7fe411da01a1e130066cd2f

税金与精确度

税金可以设置为 含税价,或者 未含税价

3fdaf4bffa364774a9eb0c9f0343cb67

odoo 在计算 订单行的 未税金额,含税金额时, 会调用 account.tax 模型的 方法 compute_all() 进行 计算, 计算时 会以 名为 Account 的小数位数设置 作为 round() 方法的小数位数, 在此例 小数位 为 2 , 当 税金为 17% 含税价 5.99, 返回

{

"taxes": [

{

"account_analytic_collected_id": false,

"account_analytic_paid_id": false,

"account_collected_id": 49,

"account_paid_id": 49,

"amount": 0.87,

"base_code_id": false,

"base_sign": 1.0,

"id": 2,

"name": "增值税17%进项税",

"price_unit": 5.119658119658119,

"ref_base_code_id": false,

"ref_base_sign": 1.0,

"ref_tax_code_id": false,

"ref_tax_sign": 1.0,

"sequence": 1,

"tax_code_id": false,

"tax_sign": 1.0,

"todo": 0

}

],

"total": 5.12,

"total_included": 5.99

}

算式 为 5.99 /1.17 = 5.11965811966

round(5.99/1.17, 2) = 5.12

在 compute_all() 方法中 预置了 个选项 round_globally,

1ec0f84910774119ad61b656e2e65ef7

启用 此选项时, 小数位数 增加 5位, 同样对于 5.99 /1.17 的处理,则更精确, 结果为 5.1196581

转载注明原作者 /by Jeffery

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值