簡體   English   中英

十進制值被 to_f 截斷

[英]Decimal values are truncating with to_f

我有一個名為 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自動減少小數限制的原因是什么? 解決這個問題的最佳方法是什么,我只是在考慮一些有限制的截斷。

我可以知道 to_f 自動減少小數限制的原因是什么?

BigDecimal#to_f方法將任意精度浮點十進制對象轉換為標准雙精度Float 當然,如果大十進制更精確,則在此轉換過程中會丟失信息。 如果超出限制,此轉換實際上可能上溢或下溢。

我只是在想一些有限制的截斷

如果您想顯式控制結果的精度, 可以使用truncate(precision)方法

您可以使用 ruby​​ 的內置 .truncate() 方法

例如:

floatNum = 1.222222222222222
truncatedNum = floatNum.truncate(3) #3 is the number of decimal places you want
puts floatNum #returns 1.222

在此處輸入圖片說明

另一種方法是使用 .round() 方法

例如:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM