简体   繁体   English

十进制值被 to_f 截断

[英]Decimal values are truncating with to_f

I have model called Item, where I am updating the unit_price (Data Type is Decimal) value, currently I am not putting any limit when storing the value, storing the value as it is.我有一个名为 Item 的模型,我在其中更新 unit_price(数据类型为十进制)值,目前我在存储值时没有设置任何限制,按原样存储值。 But now I can see this PG error PG::NumericValueOutOfRange , when the value exceeds the limit.但是现在我可以看到这个 PG 错误PG::NumericValueOutOfRange ,当值超过限制时。

So I was just trying to limit the value and checking something in the console, Below is the data.所以我只是想限制这个值并在控制台中检查一些东西,下面是数据。 (Here in the data I am not putting all the decimal values) (这里的数据我没有把所有的十进制值)

#<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

Can I know what will be the reason the to_f automatically reduce the limit of the decimal?我可以知道to_f自动减少小数限制的原因是什么? What will be best way to solve this issue, I was just thinking about some truncate with some limit.解决这个问题的最佳方法是什么,我只是在考虑一些有限制的截断。

Can I know what will be the reason the to_f automatically reduce the limit of the decimal?我可以知道 to_f 自动减少小数限制的原因是什么?

The BigDecimal#to_f method will convert an arbitrary precision floating point decimal object into a standard double precision Float ing point number. BigDecimal#to_f方法将任意精度浮点十进制对象转换为标准双精度Float Naturally, information will be lost during this conversion should the big decimal be more precise.当然,如果大十进制更精确,则在此转换过程中会丢失信息。 This conversion can actually overflow or underflow if limits are exceeded.如果超出限制,此转换实际上可能上溢或下溢。

I was just thinking about some truncate with some limit我只是在想一些有限制的截断

There is a truncate(precision) method if you'd like explicit control over the precision of the result.如果您想显式控制结果的精度, 可以使用truncate(precision)方法

you can use ruby's built-in .truncate() method您可以使用 ruby​​ 的内置 .truncate() 方法

for example:例如:

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

在此处输入图片说明

another way is to use the .round() method另一种方法是使用 .round() 方法

for example:例如:

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM