如何将BigDecimal转换为2位小数字符串?

Saq*_*Ali 19 ruby string

我想将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#truncateString#%?:

"%.2f" % BigDecimal("7.1762").truncate(2)
# => "7.17"
"%.2f" % BigDecimal("4.2").truncate(2)
# => "4.20"
Run Code Online (Sandbox Code Playgroud)

  • `"%.2f"%BigDecimal("40000000000000000.199999").truncate(2)` - 不确定是否与OP相关,但这是一个问题,因为我们要通过`Float`.虽然它确实在某种程度上打败了使用BigDecimal的目的.它是可以解决的 (3认同)
  • @NeilSlater,这个怎么样?`(BigDecimal("40000000000000000.2").truncate(2).to_s('F')+'00')[/.*\.. {2} /]` (2认同)

nis*_*shu 6

简单地格式化'%.2f'应该可以工作

v = BigDecimal("7.1233")
"%.2f" % v #=> "7.12"

v = BigDecimal("7.1")
"%.2f" % v #=> "7.10"
Run Code Online (Sandbox Code Playgroud)

  • 它对数字进行四舍五入:`"%.2f" % BigDecimal("7.129") #=> "7.13"` (3认同)

mwf*_*ley 5

关于已接受答案的评论包含重要信息。

正确地指出,在较旧版本的Ruby中,使用"%.2f" % v会导致v隐式转换为浮点数,从而导致精度/准确性的潜在损失-例如"%.2f" % (10**24) == "999999999999999983222784.00"

你可以转换BigDecimalString准确的,即使是在旧的红宝石,通过使用.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)