ma1*_*w28 7 ruby string floating-point bigdecimal
我想在Ruby中正确地将美分转换为美元.我将永远不必使用分数.
是否可以正确执行此操作(没有浮点错误)而不必使用BigDecimal?
例如,美分到美元
"99" => "0.99"
"324" => "3.24"
Run Code Online (Sandbox Code Playgroud)
以下似乎有效,但它是否正确?
(cents.to_i/100.0).to_s
Run Code Online (Sandbox Code Playgroud)
knu*_*nut 13
正如迈克尔科尔已经回答:看看金钱宝石.
例:
require 'money'
Money.use_i18n = false #https://stackoverflow.com/q/31133229/676874
puts Money.new( 99, 'USD')
puts Money.new(324, 'USD')
Run Code Online (Sandbox Code Playgroud)
以下似乎有效,但它是否正确?
Run Code Online (Sandbox Code Playgroud)(cents.to_i/100.0).to_s
第一眼看,没关系,但是:
cents = '10'
p (cents.to_i/100.0).to_s # -> '0.1'
Run Code Online (Sandbox Code Playgroud)
你没有2位数.
替代方案:
p '%.2f' % (cents.to_i/100.0) # -> '0.10'
Run Code Online (Sandbox Code Playgroud)
您也可以考虑使用 Rationals。但是,我不确定它们在 sprintf-ed 时是否会转换为浮点数:
"%.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"
Run Code Online (Sandbox Code Playgroud)
如果他们已经蜇了你可以使用字符串操作并完全绕过数字问题:
# 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"
Run Code Online (Sandbox Code Playgroud)
没有精确问题,没有浮点,没有bignums,没有理性,没有什么棘手,没有什么聪明.需要进行一些简单的修改来处理负值,但这将是已经存在的简单修改.
小智 2
这是一种单行方法,它也简单地使用字符串操作,从而完全绕过数字问题:
cents.rjust(3, "0").insert(-3, ".")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8852 次 |
| 最近记录: |