Ruby中浮点的一致舍入

我理解由于浮点的不精确表示,下面的代码’感觉’不一致。

"%.1f" % 1.14 # => 1.1 "%.1f" % 1.15 # => 1.1 "%.1f" % 1.16 # => 1.2 "%.0f" % 1.4 # => 1 "%.0f" % 1.5 # => 2 "%.0f" % 1.6 # => 2 

但是,有一种简单的方法可以将一致的浮点数舍入为5吗? 一种方法可能是明确地进行字符串操作。 是否有更简单的方法或现有的图书馆?

如果需要小数精度,请使用BigDecimal而不是浮点数。

编辑 :在将数字传递给%之前,您必须手动将数字舍入到所需的长度,否则在舍入之前它将转换为正常的浮点数。

 "%.1f" % BigDecimal('1.15').round(1) => "1.2" "%.0f" % BigDecimal('1.5').round(0) => "2" 

只需添加一个微小的插入,以确保浮点数小于0.5的东西刚刚结束。

例如,

 x = 1.15 "%.1f" % (1.000001*x) # include correction for imprecise floating-point. 

这足以处理格式化问题,同时不太可能导致相关错误。

另外:这是我之前的问题的一个明显的后续,这很好,但包括完整性。

此示例中的函数roundthis()显示如何以可控,一致的方式对数字进行舍入。 注意小软糖值。 尝试运行此示例,没有软糖,看看会发生什么。

 def roundthis(x, m) return (x/m+0.50001).floor*m end for x in [1.14, 1.15, 1.16] print "#{x} #{roundthis(x, 0.1)} \n" end for x in [1.4, 1.5, 1.6] print "#{x} #{roundthis(x, 1.0)} \n" end 

这个,放入一个名为roundtest.rb的文件中并执行打印

 bash> ruby roundtest.rb 1.14 1.1 1.15 1.2 1.16 1.2 1.4 1.0 1.5 2.0 1.6 2.0 

注意四舍五入到最接近的2,15,0.005或其他什么的容易程度。

乘以100,然后舍入,然后除以100:

 (1.15 * 100).round / 100.0 # => 1.15 

它不是很优雅,但它避免使用字符串。