小数精度保留至少两位,如 20.0 输出为"20.00", 20.00001 输出为“20.00001” 有什么比较优雅的实现方式么?
目前我是这么写的 想看看有什么优雅的奇淫巧计
def price_format(price)
text = price.to_s
text += '0' if text.match('\.\d{1}$')
end
可能是我上面表述还不够清楚 2.00.round(2) 还是 2.0 而且 2.00001.round(2) 后面就舍掉了。 我的需求是小数不满两位后面补零,超过就不管,这就是最少保留两位的意思。
这样是否满足需求?
def price_format(price)
price == price.round(2) ? format('%.2f', price) : price.to_s
end
#3 楼 @zhang_soledad 如果拿到一个数是 3.1999999999999997,你期望显示成多少?
price_format(5.3-2.1) => "3.1999999999999997"
'%.2f' % 21999.666666
=> "21999.67"
'%.2f' % 1
=> "1.00"
谢谢各位回帖 但好多人还是没搞懂 我的需求 首先 这个只是用来显示 不计算 其次 sprintf 和 round 都是不符合需求的 小数不满两位后面补零 超过两位的要保留 不要截舍
楼主是要这个效果吗?
def format_number(a)
array = a.to_s.split(".")
array.first + "." + array.last.to_s.ljust(2,'0')
end
puts format_number(3.1415926) # => 3.1415926
puts format_number(111.1) # => 111.10
如果不做计算那就只是一个格式化的操作。sprintf 其实也是一个格式化的操作,你可以自己写一个
def format_number(a)
float_number = a.to_f.to_s.split('.')[1]
size = float_number.size > 2 ? float_number.size : 2
"%.#{size}f" % a
end