新手问题 小数至少保留两位如何实现

zhang_soledad · 2015年06月29日 · 最后由 zhang_soledad 回复于 2015年07月01日 · 8454 次阅读

小数精度保留至少两位,如 20.0 输出为"20.00", 20.00001 输出为“20.00001” 有什么比较优雅的实现方式么?

听不太懂你的问题,你要的是 20.00001.round(2)么?

浮点数本来就不是精确值。20.00001 说不定只是 20.00000999999998 罢了。

#2 楼 @msg7086 不是静不精确的问题

目前我是这么写的 想看看有什么优雅的奇淫巧计

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"

#6 楼 @msg7086 你这个是计算精度的问题啊,如果不用参加后面计算的话,不满两位补 0,正则就好。

'%.2f' % 21999.666666
=> "21999.67"

'%.2f' % 1
=> "1.00"

http://ruby-doc.org/core-2.2.2/Kernel.html#method-i-sprintf

谢谢各位回帖 但好多人还是没搞懂 我的需求 首先 这个只是用来显示 不计算 其次 sprintf 和 round 都是不符合需求的 小数不满两位后面补零 超过两位的要保留 不要截舍

10 楼 已删除

楼主是要这个效果吗?

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

一看就觉得是个算钱的地方,请小心...

@rubyu2 @teddy 都很好啊 @luikore 价钱都是用 bigdecimal 算了 传进来显示而已

需要 登录 后方可回复, 如果你还没有账号请 注册新账号