我想在Ruby中將美分轉換爲美元。我將永遠不必使用分數的分數。在不使用BigDecimal的情況下將美分轉換爲美元字符串
是否可以在不使用BigDecimal
的情況下正確執行此操作(無浮點錯誤)?
例如美分,美元
"99" => "0.99"
"324" => "3.24"
以下似乎工作,但它是正確的嗎?
(cents.to_i/100.0).to_s
我想在Ruby中將美分轉換爲美元。我將永遠不必使用分數的分數。在不使用BigDecimal的情況下將美分轉換爲美元字符串
是否可以在不使用BigDecimal
的情況下正確執行此操作(無浮點錯誤)?
例如美分,美元
"99" => "0.99"
"324" => "3.24"
以下似乎工作,但它是正確的嗎?
(cents.to_i/100.0).to_s
個人而言,我不會試圖重新發明這個特定的車輪,並與money gem去。從文檔(強調):
特點
提供一個Money類它封裝了一個 一定數額的錢,所有信息,如它的價值和它的貨幣。
提供封裝關於貨幣單位的所有信息的Money :: Currency類。
將貨幣值表示爲整數,單位爲美分。這個 可以避免浮點舍入錯誤。
將貨幣表示爲 Money ::提供高度靈活性的貨幣實例。
提供用於將貨幣從一種貨幣兌換爲另一種貨幣的API。
具有 能夠將貨幣和貨幣字符串解析爲對應的貨幣/貨幣對象 。
其實賺錢的寶石[使用BigDecimal](https://github.com/RubyMoney/money/blob/master/lib/money/money/arithmetic.rb)執行分部。 – Philip
夠公平的。正如我所說的,OP沒有太多地告訴我們他打算做什麼,但我不想在其他人已經做到的時候處理所有錯綜複雜的金錢問題。 –
作爲Micheal Kohl already answered:看看錢的寶石。
例子:
require 'money'
Money.use_i18n = false #https://stackoverflow.com/q/31133229/676874
puts Money.new(99, 'USD')
puts Money.new(324, 'USD')
以下似乎工作,但它是正確的嗎?
(cents.to_i/100.0).to_s
在第一次看,這是確定的,但:
cents = '10'
p (cents.to_i/100.0).to_s # -> '0.1'
您不必2個位數。
備選:
p '%.2f' % (cents.to_i/100.0) # -> '0.10'
感謝您提供解決方案,而不只是說「使用這個寶石」。 –
您可以考慮使用有理數爲好。但是,我不知道他們究竟是怎麼轉換爲浮動時的sprintf編輯:
"%.2f" % Rational("324".to_i,100)
#=> "3.24"
"%.2f" % Rational("99".to_i,100)
#=> "0.99"
"%.2f" % Rational("80".to_i,100)
#=> "0.80"
"%.2f" % Rational("12380".to_i,100)
#=> "123.80"
如果他們蜇已經可以使用字符串操作,完全繞過數字問題:
# There are, of course, all sorts of ways to do this.
def add_decimal(s)
pfx = [ '0.00', '0.0', '0.' ]
if(pfx[s.length])
s = pfx[s.length] + s
else
s = s.dup
s[-2, 0] = '.'
end
s
end
add_decimal('') # "0.00"
add_decimal('1') # "0.01"
add_decimal('12') # "0.12"
add_decimal('123') # "1.23"
add_decimal('1234') # "12.34"
add_decimal('12345') # "123.45"
無精度問題,沒有浮點,沒有理性,沒有理性,沒有任何棘手,沒有什麼聰明。需要做一些簡單的修改來處理負值,但這將與已有的一樣簡單。
取決於您需要的精度。如果你對分精確度還行,可以拿着金錢寶石。 – Philip