Fixed number_with_precision rounding error [#6182 state:resolved]
This commit is contained in:
parent
5008d33eee
commit
f71809f257
|
@ -270,12 +270,13 @@ module ActionView
|
|||
digits, rounded_number = 1, 0
|
||||
else
|
||||
digits = (Math.log10(number.abs) + 1).floor
|
||||
rounded_number = BigDecimal.new((number / 10 ** (digits - precision)).to_s).round.to_f * 10 ** (digits - precision)
|
||||
rounded_number = (BigDecimal.new(number.to_s) / BigDecimal.new((10 ** (digits - precision)).to_f.to_s)).round.to_f * 10 ** (digits - precision)
|
||||
digits = (Math.log10(rounded_number.abs) + 1).floor # After rounding, the number of digits may have changed
|
||||
end
|
||||
precision -= digits
|
||||
precision = precision > 0 ? precision : 0 #don't let it be negative
|
||||
else
|
||||
rounded_number = BigDecimal.new((number * (10 ** precision)).to_s).round.to_f / 10 ** precision
|
||||
rounded_number = BigDecimal.new(number.to_s).round(precision).to_f
|
||||
end
|
||||
formatted_number = number_with_delimiter("%01.#{precision}f" % rounded_number, options)
|
||||
if strip_insignificant_zeros
|
||||
|
|
|
@ -100,6 +100,8 @@ class NumberHelperTest < ActionView::TestCase
|
|||
assert_equal("0", number_with_precision(0, :precision => 0))
|
||||
assert_equal("0.00100", number_with_precision(0.001, :precision => 5))
|
||||
assert_equal("0.001", number_with_precision(0.00111, :precision => 3))
|
||||
assert_equal("10.00", number_with_precision(9.995, :precision => 2))
|
||||
assert_equal("11.00", number_with_precision(10.995, :precision => 2))
|
||||
end
|
||||
|
||||
def test_number_with_precision_with_custom_delimiter_and_separator
|
||||
|
@ -125,6 +127,9 @@ class NumberHelperTest < ActionView::TestCase
|
|||
assert_equal "0.0001", number_with_precision(0.0001, :precision => 1, :significant => true )
|
||||
assert_equal "0.000100", number_with_precision(0.0001, :precision => 3, :significant => true )
|
||||
assert_equal "0.0001", number_with_precision(0.0001111, :precision => 1, :significant => true )
|
||||
assert_equal "10.0", number_with_precision(9.995, :precision => 3, :significant => true)
|
||||
assert_equal "9.99", number_with_precision(9.994, :precision => 3, :significant => true)
|
||||
assert_equal "11.0", number_with_precision(10.995, :precision => 3, :significant => true)
|
||||
end
|
||||
|
||||
def test_number_with_precision_with_strip_insignificant_zeros
|
||||
|
|
Loading…
Reference in New Issue