我想在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