Skip to content

Commit

Permalink
Merge pull request #15379 from xuanxu/rational_precision
Browse files Browse the repository at this point in the history
Fix AS::NumberHelper results with rationals
Conflicts:
	activesupport/CHANGELOG.md
  • Loading branch information
rafaelfranca committed Jun 2, 2014
1 parent 43862dd commit c345365
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 5 deletions.
1 change: 1 addition & 0 deletions actionview/test/template/number_helper_test.rb
Expand Up @@ -48,6 +48,7 @@ def test_number_with_precision
assert_equal "-111.235", number_with_precision(-111.2346)
assert_equal "111.00", number_with_precision(111, precision: 2)
assert_equal "0.00100", number_with_precision(0.001, precision: 5)
assert_equal "3.33", number_with_precision(Rational(10, 3), precision: 2)
end

def test_number_to_human_size
Expand Down
13 changes: 13 additions & 0 deletions activesupport/CHANGELOG.md
@@ -1,3 +1,16 @@
* Fixed precision error in NumberHelper when using Rationals.

before:
ActiveSupport::NumberHelper.number_to_rounded Rational(1000, 3), precision: 2
#=> "330.00"
after:
ActiveSupport::NumberHelper.number_to_rounded Rational(1000, 3), precision: 2
#=> "333.33"

See #15379.

*Juanjo Bazán*

## Rails 4.1.2 (unreleased) ##

* `Hash#deep_transform_keys` and `Hash#deep_transform_keys!` now transform hashes
Expand Down
Expand Up @@ -12,11 +12,7 @@ def convert
when Float, String
@number = BigDecimal(number.to_s)
when Rational
if significant
@number = BigDecimal(number, digit_count(number.to_i) + precision)
else
@number = BigDecimal(number, precision)
end
@number = BigDecimal(number, digit_count(number.to_i) + precision)
else
@number = number.to_d
end
Expand Down
2 changes: 2 additions & 0 deletions activesupport/test/number_helper_test.rb
Expand Up @@ -134,6 +134,7 @@ def test_to_rounded
assert_equal("111.23460000000000000000", number_helper.number_to_rounded('111.2346', :precision => 20))
assert_equal("111.23460000000000000000", number_helper.number_to_rounded(BigDecimal(111.2346, Float::DIG), :precision => 20))
assert_equal("111.2346" + "0"*96, number_helper.number_to_rounded('111.2346', :precision => 100))
assert_equal("111.2346", number_helper.number_to_rounded(Rational(1112346, 10000), :precision => 4))
end
end

Expand Down Expand Up @@ -174,6 +175,7 @@ def test_to_rounded_with_significant_digits
assert_equal "9775.0000000000000000", number_helper.number_to_rounded(BigDecimal(9775), :precision => 20, :significant => true )
assert_equal "9775.0000000000000000", number_helper.number_to_rounded("9775", :precision => 20, :significant => true )
assert_equal "9775." + "0"*96, number_helper.number_to_rounded("9775", :precision => 100, :significant => true )
assert_equal("97.7", number_helper.number_to_rounded(Rational(9772, 100), :precision => 3, :significant => true))
end
end

Expand Down

0 comments on commit c345365

Please sign in to comment.