summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authormrkn <mrkn@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-07-26 16:17:04 +0000
committermrkn <mrkn@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-07-26 16:17:04 +0000
commit2621ba04cbecb4cd22772d1a76d91beddfcc8878 (patch)
treea41a9ebe4ad1457dd7714e767148c699514eb0f9 /ext
parenta3edf1a48e4f1dc5d68f50a95d7a0f595b97f7af (diff)
Merge revisions 32676, 32677, 32679, 32680:
* ext/bigdecimal/lib/bigdecimal/util.rb (Rational#to_d): zero or negative precision is error. fixes #5098. [ruby-dev:44210] * ext/bigdecimal/lib/bigdecimal/util.rb (Float#to_d): modified for specifying precision. fixes #5098. [ruby-dev:44210] * ext/bigdecimal/lib/bigdecimal/util.rb (Integer#to_d): added for symmetry to BigDecimal() function with an Integer. fixes #5098. [ruby-dev:44210] * ext/bigdecimal/lib/bigdecimal/util.rb (BigDecimal#to_d): added for adapting other Numeric subclasses. [ruby-dev:44245] * test/bigdecimal/test_bigdecimal_util.rb: add tests for the above changes. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_3@32687 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r--ext/bigdecimal/lib/bigdecimal/util.rb39
1 files changed, 32 insertions, 7 deletions
diff --git a/ext/bigdecimal/lib/bigdecimal/util.rb b/ext/bigdecimal/lib/bigdecimal/util.rb
index 6e1697be88..b27e64c511 100644
--- a/ext/bigdecimal/lib/bigdecimal/util.rb
+++ b/ext/bigdecimal/lib/bigdecimal/util.rb
@@ -1,3 +1,20 @@
+class Integer < Numeric
+ # call-seq:
+ # int.to_d -> bigdecimal
+ #
+ # Convert +int+ to a BigDecimal and return it.
+ #
+ # require 'bigdecimal'
+ # require 'bigdecimal/util'
+ #
+ # 42.to_d
+ # # => #<BigDecimal:1008ef070,'0.42E2',9(36)>
+ #
+ def to_d
+ BigDecimal(self)
+ end
+end
+
class Float < Numeric
# call-seq:
# flt.to_d -> bigdecimal
@@ -10,8 +27,8 @@ class Float < Numeric
# 0.5.to_d
# # => #<BigDecimal:1dc69e0,'0.5E0',9(18)>
#
- def to_d
- BigDecimal(self.to_s)
+ def to_d(precision=nil)
+ BigDecimal(self, precision || Float::DIG+1)
end
end
@@ -54,6 +71,14 @@ class BigDecimal < Numeric
i + "." + ("0"*(-z)) + f
end
end
+
+ # call-seq:
+ # a.to_d -> bigdecimal
+ #
+ # Returns self.
+ def to_d
+ self
+ end
end
class Rational < Numeric
@@ -70,11 +95,11 @@ class Rational < Numeric
# # => #<BigDecimal:1a52bd8,'0.3142857142 8571427937 0154144999 105E1',45(63)>
# r.to_d(3)
# # => #<BigDecimal:1a44d08,'0.314E1',18(36)>
- def to_d(nFig=0)
- num = self.numerator.to_s
- if nFig<=0
- nFig = BigDecimal.double_fig*2+1
+ def to_d(precision)
+ if precision <= 0
+ raise ArgumentError, "negative precision"
end
- BigDecimal.new(num).div(self.denominator,nFig)
+ num = self.numerator
+ BigDecimal(num).div(self.denominator, precision)
end
end