我在使用sprintf
进行舍入时出现问题。我以'%0.0f'
作为格式传递。 sprintf
轮次不符合预期:0.5
应舍入为1
,而是舍入为0
,这违反了一般舍入规则,而1.5
,正确舍入2.5
等:
sprintf('%0.0f', 0.5)
=> "0"
sprintf('%0.0f', 1.5)
=> "2"
为什么会这样,我怎样才能达到预期的行为?
答案 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.5
和0
的中间,因此它往往是1
,因为它是偶数。