2017-02-16 60 views
5

Ruby 2.4 использует гауссово округление для округления чисел с плавающей запятой.Изменения плавающего округления в Ruby 2.4

Согласно Википедии:

Галстук отключающая правило, менее предвзято (даже тогда, когда исходные числа положительные или отрицательные с неодинаковой вероятностью) круглая половина даже. По этому соглашению, если доля y равна 0,5, то q является четным целым, ближайшим к y. Так, например, +23.5 становится +24, как и +24,5; в то время как -23.5 становится -24, как -24.5.

Однако выполнение следующего кода в Ruby 2.4 дает отличный результат, чем ожидается.

[1.5, 2.5, 3.5, 4.5, 5.5].each { | num | puts num.round } 
# output: 
2 
3 
4 
5 
6 
# expected output(based on Gaussian rounding): 
2 
2 
4 
4 
6 

Может кто-нибудь объяснить, почему это так или что мне не хватает?

ответ

7

Чтобы применить гауссовое округление, вам необходимо передать ключевое слово аргумент :half.

Ключевое слово аргумент :half может принимать либо :down, либо :even, и поведение по умолчанию по-прежнему округляется, как и раньше.

# ruby 2.4.0-rc1 
irb(main):001:0> (2.5).round 
# => 3 
irb(main):008:0> (2.5).round(half: :down) 
# => 2 
irb(main):009:0> (2.5).round(half: :even) 
# => 2 

Подоплека этого решения в this blog post.