Skip to content

Commit 60062cf

Browse files
committed
Fix AS::NumberHelper results with rationals
:precision was incorrectly being applied to Rationals before: ActiveSupport::NumberHelper.number_to_rounded Rational(10, 3), precision: 2 => "3.3" after: ActiveSupport::NumberHelper.number_to_rounded Rational(10, 3), precision: 2 => "3.33"
1 parent 4d83c2a commit 60062cf

File tree

4 files changed

+17
-5
lines changed

4 files changed

+17
-5
lines changed

actionview/test/template/number_helper_test.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ def test_number_with_precision
4848
assert_equal "-111.235", number_with_precision(-111.2346)
4949
assert_equal "111.00", number_with_precision(111, precision: 2)
5050
assert_equal "0.00100", number_with_precision(0.001, precision: 5)
51+
assert_equal "3.33", number_with_precision(Rational(10, 3), precision: 2)
5152
end
5253

5354
def test_number_to_human_size

activesupport/CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,16 @@
1+
* Fixed precision error in NumberHelper when using Rationals.
2+
3+
before:
4+
ActiveSupport::NumberHelper.number_to_rounded Rational(1000, 3), precision: 2
5+
#=> "330.00"
6+
after:
7+
ActiveSupport::NumberHelper.number_to_rounded Rational(1000, 3), precision: 2
8+
#=> "333.33"
9+
10+
See #15379.
11+
12+
*Juanjo Bazán*
13+
114
* Removed deprecated `Numeric#ago` and friends
215

316
Replacements:

activesupport/lib/active_support/number_helper/number_to_rounded_converter.rb

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,7 @@ def convert
1212
when Float, String
1313
@number = BigDecimal(number.to_s)
1414
when Rational
15-
if significant
16-
@number = BigDecimal(number, digit_count(number.to_i) + precision)
17-
else
18-
@number = BigDecimal(number, precision)
19-
end
15+
@number = BigDecimal(number, digit_count(number.to_i) + precision)
2016
else
2117
@number = number.to_d
2218
end

activesupport/test/number_helper_test.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ def test_to_rounded
134134
assert_equal("111.23460000000000000000", number_helper.number_to_rounded('111.2346', :precision => 20))
135135
assert_equal("111.23460000000000000000", number_helper.number_to_rounded(BigDecimal(111.2346, Float::DIG), :precision => 20))
136136
assert_equal("111.2346" + "0"*96, number_helper.number_to_rounded('111.2346', :precision => 100))
137+
assert_equal("111.2346", number_helper.number_to_rounded(Rational(1112346, 10000), :precision => 4))
137138
end
138139
end
139140

@@ -174,6 +175,7 @@ def test_to_rounded_with_significant_digits
174175
assert_equal "9775.0000000000000000", number_helper.number_to_rounded(BigDecimal(9775), :precision => 20, :significant => true )
175176
assert_equal "9775.0000000000000000", number_helper.number_to_rounded("9775", :precision => 20, :significant => true )
176177
assert_equal "9775." + "0"*96, number_helper.number_to_rounded("9775", :precision => 100, :significant => true )
178+
assert_equal("97.7", number_helper.number_to_rounded(Rational(9772, 100), :precision => 3, :significant => true))
177179
end
178180
end
179181

0 commit comments

Comments
 (0)