Nod*_*rov 4 ruby format floating-point
有一个浮点数num = 22.0098
.如何将其格式化为浮点后限制3位数?我试过sprintf('%.3f',num)
,但回报是22.010
,我需要的22.009
不过
我可以想到使用bigdecimal.不确定,如果它是一个矫枉过正:
require 'bigdecimal'
BigDecimal::new("22.0098").truncate(3).to_f
#=> 22.009
Run Code Online (Sandbox Code Playgroud)
不幸的是,与 不同的是Float#round
,Float#floor
它不接受一定数量的数字。下面的代码实现了所需的行为。
def floor_float input, digits = 3\n input.divmod(10 ** -digits).first / (10 ** digits).to_f \nend \n
Run Code Online (Sandbox Code Playgroud)\n\n这可以用作猴子补丁:
\n\nclass Float\n def floor_ext digits = 3\n self.divmod(10 ** -digits).first / (10 ** digits).to_f \n end \nend\n22.0098.floor_ext\n#\xe2\x87\x92 22.009\n
Run Code Online (Sandbox Code Playgroud)\n\n正如@Stefan 所建议的,可能是更简洁的变体:
\n\nclass Float\n def floor_ext digits = 3\n div(10 ** -digits).fdiv(10 ** digits)\n end \nend\n22.0098.floor_ext\n#\xe2\x87\x92 22.009\n
Run Code Online (Sandbox Code Playgroud)\n\n或者,可以明确地处理字符串:
\n\ni, f = 22.0098.to_s.split(\'.\')\n#\xe2\x87\x92 [ "22", "0098" ]\n[i, f[0..2]].join(\'.\')\n#\xe2\x87\x92 "22.009"\n
Run Code Online (Sandbox Code Playgroud)\n