1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
# frozen_string_literal: false
require_relative "helper"
require 'bigdecimal/util'
class TestBigDecimalUtil < Test::Unit::TestCase
include TestBigDecimalBase
def test_BigDecimal_to_d
x = BigDecimal(1)
assert_same(x, x.to_d)
end
def test_Integer_to_d
assert_equal(BigDecimal(1), 1.to_d)
assert_equal(BigDecimal(2<<100), (2<<100).to_d)
assert(1.to_d.frozen?)
end
def test_Float_to_d_without_precision
delta = 1.0/10**(Float::DIG+1)
assert_in_delta(BigDecimal(0.5, 0), 0.5.to_d, delta)
assert_in_delta(BigDecimal(355.0/113.0, 0), (355.0/113.0).to_d, delta)
assert_equal(9.05, 9.05.to_d.to_f)
assert_equal("9.05", 9.05.to_d.to_s('F'))
assert_equal("65.6", 65.6.to_d.to_s("F"))
assert_equal(Math::PI, Math::PI.to_d.to_f)
bug9214 = '[ruby-core:58858]'
assert_equal((-0.0).to_d.sign, -1, bug9214)
assert_raise(TypeError) { 0.3.to_d(nil) }
assert_raise(TypeError) { 0.3.to_d(false) }
assert(1.1.to_d.frozen?)
assert_equal(BigDecimal("999_999.9999"), 999_999.9999.to_d)
end
def test_Float_to_d_with_precision
digits = 5
delta = 1.0/10**(digits)
assert_in_delta(BigDecimal(0.5, 5), 0.5.to_d(digits), delta)
assert_in_delta(BigDecimal(355.0/113.0, 5), (355.0/113.0).to_d(digits), delta)
bug9214 = '[ruby-core:58858]'
assert_equal((-0.0).to_d(digits).sign, -1, bug9214)
assert(1.1.to_d(digits).frozen?)
end
def test_Float_to_d_bug13331
assert_equal(64.4.to_d,
1.to_d * 64.4,
"[ruby-core:80234] [Bug #13331]")
assert_equal((2*Math::PI).to_d,
2.to_d * Math::PI,
"[ruby-core:80234] [Bug #13331]")
end
def test_Float_to_d_issue_192
# https://github.com/ruby/bigdecimal/issues/192
# https://github.com/rails/rails/pull/42125
if BASE_FIG == 9
flo = 1_000_000_000.12345
big = BigDecimal("0.100000000012345e10")
else # BASE_FIG == 4
flo = 1_0000.12
big = BigDecimal("0.1000012e5")
end
assert_equal(flo.to_d, big, "[ruby/bigdecimal#192]")
end
def test_Rational_to_d
digits = 100
delta = 1.0/10**(digits)
assert_in_delta(BigDecimal(1.quo(2), digits), 1.quo(2).to_d(digits), delta)
assert_in_delta(BigDecimal(355.quo(113), digits), 355.quo(113).to_d(digits), delta)
assert(355.quo(113).to_d(digits).frozen?)
end
def test_Rational_to_d_with_zero_precision
assert_equal(BigDecimal(355.quo(113), 0), 355.quo(113).to_d(0))
end
def test_Rational_to_d_with_negative_precision
assert_raise(ArgumentError) { 355.quo(113).to_d(-42) }
end
def test_Complex_to_d
BigDecimal.save_rounding_mode do
BigDecimal.mode(BigDecimal::ROUND_MODE, BigDecimal::ROUND_HALF_EVEN)
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
end
def test_String_to_d
assert_equal(BigDecimal('1'), "1__1_1".to_d)
assert_equal(BigDecimal('2.5'), "2.5".to_d)
assert_equal(BigDecimal('2.5'), "2.5 degrees".to_d)
assert_equal(BigDecimal('2.5e1'), "2.5e1 degrees".to_d)
assert_equal(BigDecimal('0'), "degrees 100.0".to_d)
assert_equal(BigDecimal('0.125'), "0.1_2_5".to_d)
assert_equal(BigDecimal('0.125'), "0.1_2_5__".to_d)
assert_equal(BigDecimal('1'), "1_.125".to_d)
assert_equal(BigDecimal('1'), "1._125".to_d)
assert_equal(BigDecimal('0.1'), "0.1__2_5".to_d)
assert_equal(BigDecimal('0.1'), "0.1_e10".to_d)
assert_equal(BigDecimal('0.1'), "0.1e_10".to_d)
assert_equal(BigDecimal('1'), "0.1e1__0".to_d)
assert_equal(BigDecimal('1.2'), "1.2.3".to_d)
assert_equal(BigDecimal('1'), "1.".to_d)
assert_equal(BigDecimal('1'), "1e".to_d)
assert("2.5".to_d.frozen?)
end
def test_invalid_String_to_d
assert_equal("invalid".to_d, BigDecimal('0.0'))
end
def test_Nil_to_d
assert_equal(nil.to_d, BigDecimal('0.0'))
assert(nil.to_d)
end
end
|