我想将BigDecimal对象转换为货币值到两个小数位.我不想要任何四舍五入.我该怎么做?
以下方法均无效:
v = BigDecimal("7.1762")
w = BigDecimal("4.2")
v.to_s('2F') # => "7.17 62"
v.to_s('F') # => "7.1762"
v.to_s('%0.2F') # => "0.71762E1"
v.to_s('%0.2f') # => "0.71762E1"
v.truncate(2).to_s('F') # => "7.17" # This one looks like it worked
w.truncate(2).to_s('F') # => "4.2" # But it doesn't pad with the trailing zero(es)
Run Code Online (Sandbox Code Playgroud)
fal*_*tru 19
如何组合BigDecimal#truncate和String#%?:
"%.2f" % BigDecimal("7.1762").truncate(2)
# => "7.17"
"%.2f" % BigDecimal("4.2").truncate(2)
# => "4.20"
Run Code Online (Sandbox Code Playgroud)
简单地格式化'%.2f'应该可以工作
v = BigDecimal("7.1233")
"%.2f" % v #=> "7.12"
v = BigDecimal("7.1")
"%.2f" % v #=> "7.10"
Run Code Online (Sandbox Code Playgroud)
关于已接受答案的评论包含重要信息。
正确地指出,在较旧版本的Ruby中,使用"%.2f" % v会导致v隐式转换为浮点数,从而导致精度/准确性的潜在损失-例如"%.2f" % (10**24) == "999999999999999983222784.00"
你可以转换BigDecimal到String准确的,即使是在旧的红宝石,通过使用.to_s("F")。这将以定点格式返回数字,带小数点后跟零个或多个十进制数字。
如果"00"在数字的末尾加上数字(以确保它具有两个或多个十进制数字),则可以使用正则表达式/.*\..{2}/(例如,任何字符;一个小数点;然后再加上两个字符)将其剥离掉,因此它只会保留小数点后的前两位数字。
require 'bigdecimal'
w = BigDecimal("4.2")
w.truncate(2).to_s("F") # => "4.2"
(w.truncate(2).to_s("F") + "00") # => "4.200"
(w.truncate(2).to_s("F") + "00")[ /.*\..{2}/ ] # => "4.20"
Run Code Online (Sandbox Code Playgroud)