diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c index 34817304e8..0d9d0518a8 100644 --- a/ext/bigdecimal/bigdecimal.c +++ b/ext/bigdecimal/bigdecimal.c @@ -335,15 +335,18 @@ BigDecimal_double_fig(VALUE self) return INT2FIX(VpDblFig()); } -/* call-seq: - * precs +/* call-seq: + * big_decimal.precs -> array * - * Returns an Array of two Integer values. + * Returns an Array of two Integer values. * - * The first value is the current number of significant digits in the - * BigDecimal. The second value is the maximum number of significant digits - * for the BigDecimal. + * The first value is the current number of significant digits in the + * BigDecimal. The second value is the maximum number of significant digits + * for the BigDecimal. + * + * BigDecimal('5').precs #=> [9, 18] */ + static VALUE BigDecimal_prec(VALUE self) { @@ -456,7 +459,7 @@ check_rounding_mode_option(VALUE const opts) goto noopt; mode = rb_hash_lookup2(opts, ID2SYM(id_half), Qundef); - if (mode == Qundef) + if (mode == Qundef || NIL_P(mode)) goto noopt; if (SYMBOL_P(mode)) @@ -478,6 +481,7 @@ check_rounding_mode_option(VALUE const opts) return VP_ROUND_HALF_EVEN; else if (strncasecmp(s, "down", 4) == 0) return VP_ROUND_HALF_DOWN; + break; default: break; } @@ -901,13 +905,14 @@ BigDecimal_coerce(VALUE self, VALUE other) } /* - * call-seq: +@ + * call-seq: + * +big_decimal -> big_decimal * * Return self. * - * e.g. - * b = +a # b == a + * +BigDecimal('5') #=> 0.5e1 */ + static VALUE BigDecimal_uplus(VALUE self) { @@ -1218,14 +1223,14 @@ BigDecimal_ge(VALUE self, VALUE r) } /* - * call-seq: -@ + * call-seq: + * -big_decimal -> big_decimal * - * Return the negation of self. + * Return the negation of self. * - * e.g. - * b = -a - * b == a * -1 + * -BigDecimal('5') #=> -0.5e1 */ + static VALUE BigDecimal_neg(VALUE self) { @@ -1672,11 +1677,16 @@ BigDecimal_mult2(VALUE self, VALUE b, VALUE n) } } -/* Returns the absolute value, as a BigDecimal. +/* + * call-seq: + * big_decimal.abs -> big_decimal * - * BigDecimal('5').abs #=> 5 - * BigDecimal('-3').abs #=> 3 + * Returns the absolute value, as a BigDecimal. + * + * BigDecimal('5').abs #=> 0.5e1 + * BigDecimal('-3').abs #=> 0.3e1 */ + static VALUE BigDecimal_abs(VALUE self) { diff --git a/ext/bigdecimal/bigdecimal.gemspec b/ext/bigdecimal/bigdecimal.gemspec index e01649f2fe..3767e9b65d 100644 --- a/ext/bigdecimal/bigdecimal.gemspec +++ b/ext/bigdecimal/bigdecimal.gemspec @@ -1,5 +1,5 @@ # coding: utf-8 -_VERSION = '1.3.0.pre.2' +_VERSION = '1.3.0' Gem::Specification.new do |s| s.name = "bigdecimal" diff --git a/ext/bigdecimal/lib/bigdecimal/math.rb b/ext/bigdecimal/lib/bigdecimal/math.rb index 3ddde6a9a0..ef1a02b38f 100644 --- a/ext/bigdecimal/lib/bigdecimal/math.rb +++ b/ext/bigdecimal/lib/bigdecimal/math.rb @@ -26,7 +26,7 @@ require 'bigdecimal' # include BigMath # # a = BigDecimal((PI(100)/2).to_s) -# puts sin(a,100) # => 0.10000000000000000000......E1 +# puts sin(a,100) # => 0.99999999999999999999......e0 # module BigMath module_function @@ -38,7 +38,7 @@ module BigMath # precision, +numeric+. # # BigMath.sqrt(BigDecimal.new('2'), 16).to_s - # #=> "0.1414213562373095048801688724E1" + # #=> "0.1414213562373095048801688724e1" # def sqrt(x, prec) x.sqrt(prec) @@ -53,7 +53,7 @@ module BigMath # If +decimal+ is Infinity or NaN, returns NaN. # # BigMath.sin(BigMath.PI(5)/4, 5).to_s - # #=> "0.70710678118654752440082036563292800375E0" + # #=> "0.70710678118654752440082036563292800375e0" # def sin(x, prec) raise ArgumentError, "Zero or negative precision for sin" if prec <= 0 @@ -97,7 +97,7 @@ module BigMath # If +decimal+ is Infinity or NaN, returns NaN. # # BigMath.cos(BigMath.PI(4), 16).to_s - # #=> "-0.999999999999999999999999999999856613163740061349E0" + # #=> "-0.999999999999999999999999999999856613163740061349e0" # def cos(x, prec) raise ArgumentError, "Zero or negative precision for cos" if prec <= 0 @@ -141,7 +141,7 @@ module BigMath # If +decimal+ is NaN, returns NaN. # # BigMath.atan(BigDecimal.new('-1'), 16).to_s - # #=> "-0.785398163397448309615660845819878471907514682065E0" + # #=> "-0.785398163397448309615660845819878471907514682065e0" # def atan(x, prec) raise ArgumentError, "Zero or negative precision for atan" if prec <= 0 @@ -178,7 +178,7 @@ module BigMath # +numeric+. # # BigMath.PI(10).to_s - # #=> "0.3141592653589793238462643388813853786957412E1" + # #=> "0.3141592653589793238462643388813853786957412e1" # def PI(prec) raise ArgumentError, "Zero or negative precision for PI" if prec <= 0 @@ -223,7 +223,7 @@ module BigMath # digits of precision, +numeric+. # # BigMath.E(10).to_s - # #=> "0.271828182845904523536028752390026306410273E1" + # #=> "0.271828182845904523536028752390026306410273e1" # def E(prec) raise ArgumentError, "Zero or negative precision for E" if prec <= 0 diff --git a/ext/bigdecimal/lib/bigdecimal/util.rb b/ext/bigdecimal/lib/bigdecimal/util.rb index 79e0ebde8b..670a625563 100644 --- a/ext/bigdecimal/lib/bigdecimal/util.rb +++ b/ext/bigdecimal/lib/bigdecimal/util.rb @@ -13,7 +13,7 @@ class Integer < Numeric # require 'bigdecimal/util' # # 42.to_d - # # => # + # # => 0.42e2 # def to_d BigDecimal(self) @@ -34,7 +34,7 @@ class Float < Numeric # require 'bigdecimal/util' # # 0.5.to_d - # # => # + # # => 0.5e0 # def to_d(precision=nil) BigDecimal(self, precision || Float::DIG) @@ -55,7 +55,7 @@ class String # require 'bigdecimal/util' # # "0.5".to_d - # # => # + # # => 0.5e0 # def to_d BigDecimal(self) @@ -117,7 +117,7 @@ class Rational < Numeric # r = (22/7.0).to_r # # => (7077085128725065/2251799813685248) # r.to_d(3) - # # => # + # # => 0.314e1 def to_d(precision) if precision <= 0 raise ArgumentError, "negative precision" diff --git a/test/bigdecimal/test_bigdecimal.rb b/test/bigdecimal/test_bigdecimal.rb index 45a65d8164..80ffc3fedd 100644 --- a/test/bigdecimal/test_bigdecimal.rb +++ b/test/bigdecimal/test_bigdecimal.rb @@ -1082,10 +1082,48 @@ class TestBigDecimal < Test::Unit::TestCase assert_equal(BigDecimal('-7.1364'), BigDecimal('-7.1364499').round(4, half: :down)) end + def test_round_half_nil + x = BigDecimal.new("2.5") + + BigDecimal.save_rounding_mode do + BigDecimal.mode(BigDecimal::ROUND_MODE, BigDecimal::ROUND_UP) + assert_equal(3, x.round(0, half: nil)) + end + + BigDecimal.save_rounding_mode do + BigDecimal.mode(BigDecimal::ROUND_MODE, BigDecimal::ROUND_DOWN) + assert_equal(2, x.round(0, half: nil)) + end + + BigDecimal.save_rounding_mode do + BigDecimal.mode(BigDecimal::ROUND_MODE, BigDecimal::ROUND_HALF_UP) + assert_equal(3, x.round(0, half: nil)) + end + + BigDecimal.save_rounding_mode do + BigDecimal.mode(BigDecimal::ROUND_MODE, BigDecimal::ROUND_HALF_DOWN) + assert_equal(2, x.round(0, half: nil)) + end + + BigDecimal.save_rounding_mode do + BigDecimal.mode(BigDecimal::ROUND_MODE, BigDecimal::ROUND_HALF_EVEN) + assert_equal(2, x.round(0, half: nil)) + end + + BigDecimal.save_rounding_mode do + BigDecimal.mode(BigDecimal::ROUND_MODE, BigDecimal::ROUND_CEILING) + assert_equal(3, x.round(0, half: nil)) + end + + BigDecimal.save_rounding_mode do + BigDecimal.mode(BigDecimal::ROUND_MODE, BigDecimal::ROUND_FLOOR) + assert_equal(2, x.round(0, half: nil)) + end + end + def test_round_half_invalid_option assert_raise_with_message(ArgumentError, "invalid rounding mode: invalid") { BigDecimal('12.5').round(half: :invalid) } assert_raise_with_message(ArgumentError, "invalid rounding mode: invalid") { BigDecimal('2.15').round(1, half: :invalid) } - assert_raise_with_message(ArgumentError, "invalid rounding mode: nil") { BigDecimal('12.5').round(half: nil) } end def test_truncate