sprintf格式与预期不符

时间:2018-02-09 14:39:28

标签: ruby printf

我在使用sprintf进行舍入时出现问题。我以'%0.0f'作为格式传递。 sprintf轮次不符合预期:0.5应舍入为1,而是舍入为0,这违反了一般舍入规则,而1.5,正确舍入2.5等:

sprintf('%0.0f', 0.5)
=> "0"


sprintf('%0.0f', 1.5)
=> "2"

为什么会这样,我怎样才能达到预期的行为?

3 个答案:

答案 0 :(得分:4)

sprintf执行银行家的舍入,其舍入0.5到最接近的偶数。统计学家经常使用这种方法,因为它不会人为地夸大平均值,例如 half-up rounding

Float#round方法(在Ruby 2.4+中)接受一个参数,该参数可以是以下之一:

  • half: :up(默认)
  • half: :down
  • half: :even(银行家四舍五入)

显然您期望round的默认设置,因此您可以在打印前对您的号码进行.round

答案 1 :(得分:3)

  

我怎样才能达到预期的行为?

在将它交给sprintf:

之前将其浮动
2.4.0 :001 > sprintf('%0.0f', 0.5.round)
 => "1" 

2.4.0 :002 > sprintf('%0.0f', 1.5.round)
 => "2" 

答案 2 :(得分:0)

这是<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script> <span class="item"></span> <span class="item"></span> <span class="item"></span> <span class="item"></span> <span class="item"></span> <span class="item"></span>的预期行为。默认的舍入模式是舍入到最接近的有效值,如果是平局则选择偶数。由于printf被视为恰好位于0.50的中间,因此它往往是1,因为它是偶数。