我有以下字串:
“1.273,08”
我需要轉換為浮點數,結果必須是:
1273.08
我使用 gsub 嘗試了一些代碼,但我無法解決這個問題。我該如何進行這種轉換?
uj5u.com熱心網友回復:
您已經收到了兩個很好的答案,如何String使用String#delete和將您的內容按摩成您想要的格式String#tr。
但還有一個更深層次的問題。
十進制值 1 273.08 10 無法準確表示為 IEEE 754-2019 / ISO/IEC 60559:2020 binary64浮點值。
就像值 1/3rd 可以很容易地用三元 (0.1 3 ) 表示,但在十進制中有無限表示 (0.33333333… 10,即 0.[3]… 10 ),因此無法準確表示,值 8/100th可以很容易地表示為十進制 (0.08 10 ),但可以無限表示為二進制 (0.0001010001111010111000010100011110101110000101… 2,即 0.[00010100011110] 10 )。換句話說,將1 273.08 10表示為 Ruby是不可能的。Float
這不是特定于 Ruby 的,甚至不是特定于編程的,這只是基本的高中數學:你不能用二進制表示這個數字,周期,就像你不能用十進制表示 1/3 或任何整數基數的 π。
當然,計算機沒有無限記憶體,所以 1 273.08 10不僅在二進制中有無限表示,而且作為Float,它也會在 64 位后被截斷。最接近的可能值,以1 273.08 10作為IEEE 754-2019 / ISO / IEC 60559:2020 binary64浮點值是1 273.079 999 999 999 927 240 423 858 17 10,這是小于1 273.08 10。
這就是為什么你永遠不應該用二進制數來表示貨幣:每個人都希望它是十進制的,而不是二進制的;如果我寫支票,我用十進制而不是二進制寫。人們會期望不可能代表 1/3 美元,他們會期望不可能代表 $ π,但他們不會期望也不接受如果他們將 1273.08 美元存入他們的賬戶,他們實際上最終會得到略低于那個。
表示金錢的正確方法是使用專門的Money資料型別,或者至少使用bigdecimal標準庫中的庫:
require 'bigdecimal'
BigDecimal('1.273,08'.delete('.').tr(',', '.'))
#=> 0.127308e4
uj5u.com熱心網友回復:
我會做
"1.273,08".delete('.') # delete '.' from the string
.tr(',', '.') # replace ',' with '.'
.to_f # translate to float
#=> 1273.08
uj5u.com熱心網友回復:
因此,我們使用.千位分隔符而,不是點:
str = "1.273,08"
str.gsub('.','').gsub(',', '.').to_f
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/344645.html
標籤:红宝石
下一篇:檢查采樣貓鼬的結果
