From 03a33603c66bf6eca6937d221f87daf3f5a489f7 Mon Sep 17 00:00:00 2001 From: Kenta Murata Date: Wed, 9 Oct 2019 10:39:39 +0900 Subject: [ruby/bigdecimal] Add Complex#to_d https://github.com/ruby/bigdecimal/commit/97e794ac97 --- ext/bigdecimal/lib/bigdecimal/util.rb | 33 +++++++++++++++++++++++++++++++++ test/bigdecimal/test_bigdecimal_util.rb | 12 ++++++++++++ 2 files changed, 45 insertions(+) diff --git a/ext/bigdecimal/lib/bigdecimal/util.rb b/ext/bigdecimal/lib/bigdecimal/util.rb index 4ece8347bd..66fff7867b 100644 --- a/ext/bigdecimal/lib/bigdecimal/util.rb +++ b/ext/bigdecimal/lib/bigdecimal/util.rb @@ -131,6 +131,39 @@ class Rational < Numeric end +class Complex < Numeric + # call-seq: + # cmp.to_d -> bigdecimal + # cmp.to_d(precision) -> bigdecimal + # + # Returns the value as a BigDecimal. + # + # The +precision+ parameter is required for a rational complex number. + # This parameter is used to determine the number of significant digits + # for the result. + # + # require 'bigdecimal' + # require 'bigdecimal/util' + # + # Complex(0.1234567, 0).to_d(4) # => 0.1235e0 + # Complex(Rational(22, 7), 0).to_d(3) # => 0.314e1 + # + # See also BigDecimal::new. + # + def to_d(*args) + BigDecimal(self) unless self.imag.zero? # to raise eerror + + if args.length == 0 + case self.real + when Rational + BigDecimal(self.real) # to raise error + end + end + self.real.to_d(*args) + end +end + + class NilClass # call-seq: # nil.to_d -> bigdecimal diff --git a/test/bigdecimal/test_bigdecimal_util.rb b/test/bigdecimal/test_bigdecimal_util.rb index b963fcdeeb..c4d5816987 100644 --- a/test/bigdecimal/test_bigdecimal_util.rb +++ b/test/bigdecimal/test_bigdecimal_util.rb @@ -60,6 +60,18 @@ class TestBigDecimalUtil < Test::Unit::TestCase assert_raise(ArgumentError) { 355.quo(113).to_d(-42) } end + def test_Complex_to_d + assert_equal(BigDecimal("1"), Complex(1, 0).to_d) + assert_equal(BigDecimal("0.333333333333333333333"), + Complex(1.quo(3), 0).to_d(21)) + assert_equal(BigDecimal("0.1234567"), Complex(0.1234567, 0).to_d) + assert_equal(BigDecimal("0.1235"), Complex(0.1234567, 0).to_d(4)) + + assert_raise_with_message(ArgumentError, "can't omit precision for a Rational.") { Complex(1.quo(3), 0).to_d } + + assert_raise_with_message(ArgumentError, "Unable to make a BigDecimal from non-zero imaginary number") { Complex(1, 1).to_d } + end + def test_String_to_d assert_equal(BigDecimal('1'), "1__1_1".to_d) assert_equal(BigDecimal('2.5'), "2.5".to_d) -- cgit v1.2.3