mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
bigdecimal: version 1.3.0
Import bigdecimal version 1.3.0. The full commit log is here: https://github.com/ruby/bigdecimal/compare/v1.3.0.pre.2...v1.3.0 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57145 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
4f618f5a00
commit
bd288dcc8b
5 changed files with 79 additions and 31 deletions
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -13,7 +13,7 @@ class Integer < Numeric
|
|||
# require 'bigdecimal/util'
|
||||
#
|
||||
# 42.to_d
|
||||
# # => #<BigDecimal:1008ef070,'0.42E2',9(36)>
|
||||
# # => 0.42e2
|
||||
#
|
||||
def to_d
|
||||
BigDecimal(self)
|
||||
|
@ -34,7 +34,7 @@ class Float < Numeric
|
|||
# require 'bigdecimal/util'
|
||||
#
|
||||
# 0.5.to_d
|
||||
# # => #<BigDecimal:1dc69e0,'0.5E0',9(18)>
|
||||
# # => 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
|
||||
# # => #<BigDecimal:1dc69e0,'0.5E0',9(18)>
|
||||
# # => 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)
|
||||
# # => #<BigDecimal:1a44d08,'0.314E1',18(36)>
|
||||
# # => 0.314e1
|
||||
def to_d(precision)
|
||||
if precision <= 0
|
||||
raise ArgumentError, "negative precision"
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue