【发布时间】:2021-10-12 21:15:11
【问题描述】:
我有一个名为 Item 的模型,我在其中更新 unit_price(数据类型为十进制)值,目前我在存储值时没有设置任何限制,按原样存储值。但是现在我可以看到这个 PG 错误 PG::NumericValueOutOfRange,当值超过限制时。
所以我只是想限制值并在控制台中检查一些东西,下面是数据。 (这里的数据我没有放所有的十进制值)
#<Item id: 167199, description: "192830139", category_id: 10327, unit_id: 5596, weight: 0.1e5, unit_price: 0.4083333333659917816764132553606237816656920077972709552126705653021442494641325536062378168e1
i = Item.find 167199
i.unit_price.to_f
=> 4.083333333659918
#<Item id: 167199, description: "192830139", category_id: 10327, unit_id: 5596, weight: 0.1e5, unit_price: 0.6511366980197836882065909262763993442019943880913510722934069011050182329156169820243980265070876781866034494363303661586489199452739290976143216266200531728395970406461889852558384421962422689303402903e-2
i.unit_price.to_f
=> 0.006511366980197837
我能知道to_f自动减少小数限制的原因是什么吗?解决此问题的最佳方法是什么,我只是在考虑一些有限制的截断。
【问题讨论】:
-
好吧,浮点数的精度有限。您可以改用BigDecimal。解决此问题的另一种常见方法是使用可能的最小单位将货币值存储为整数,例如1.95 美元,
195(美分)。 -
顺便说一句,你为什么会有这样的
unit_price?您是否在数据库之外使用浮点数? (你不应该) -
不,我现在没有在 ruby 级别使用任何 to_f,目前存储我们从计算中得到的任何内容。
-
为什么需要大约 100 位小数?
-
有大量文章介绍了为什么永远不要使用浮点数进行货币单位或计算。这个问题对我来说听起来像是xy problem。
标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-5