diff --git a/spec/std/big/big_decimal_spec.cr b/spec/std/big/big_decimal_spec.cr index 8708d0f5f9c9..8db3d444d8dc 100644 --- a/spec/std/big/big_decimal_spec.cr +++ b/spec/std/big/big_decimal_spec.cr @@ -337,36 +337,50 @@ describe BigDecimal do bd2 = BigDecimal.new(-123, 5) bd3 = BigDecimal.new(123, 0) bd4 = BigDecimal.new(-123, 0) + bd5 = "-123.000".to_big_d + bd6 = "-1.1".to_big_d bd1.to_i.should eq 0 bd2.to_i.should eq 0 bd3.to_i.should eq 123 bd4.to_i.should eq -123 + bd5.to_i.should eq -123 + bd6.to_i.should eq -1 bd1.to_u.should eq 0 bd2.to_u.should eq 0 bd3.to_u.should eq 123 bd4.to_u.should eq 123 + bd5.to_u.should eq 123 + bd6.to_u.should eq 1 bd1.to_f.should eq 0.00123 bd2.to_f.should eq -0.00123 bd3.to_f.should eq 123.0 bd4.to_f.should eq -123.0 + bd5.to_f.should eq -123.0 + bd6.to_f.should eq -1.1 bd1.to_i!.should eq 0 bd2.to_i!.should eq 0 bd3.to_i!.should eq 123 bd4.to_i!.should eq -123 + bd5.to_i!.should eq -123 + bd6.to_i!.should eq -1 bd1.to_u!.should eq 0 bd2.to_u!.should eq 0 bd3.to_u!.should eq 123 bd4.to_u!.should eq 123 + bd5.to_u!.should eq 123 + bd6.to_u!.should eq 1 bd1.to_f!.should eq 0.00123 bd2.to_f!.should eq -0.00123 bd3.to_f!.should eq 123.0 bd4.to_f!.should eq -123.0 + bd5.to_f!.should eq -123.0 + bd6.to_f!.should eq -1.1 end it "hashes" do @@ -435,6 +449,9 @@ describe BigDecimal do it { -2.01.to_big_d.ceil.should eq(-2) } it { -2.91.to_big_d.ceil.should eq(-2) } + + it { "-123.000".to_big_d.ceil.value.should eq(-123) } + it { "-1.1".to_big_d.ceil.value.should eq(-1) } end describe "#floor" do @@ -445,6 +462,9 @@ describe BigDecimal do it { 2.11.to_big_d.floor.should eq(2) } it { 2.91.to_big_d.floor.should eq(2) } it { -2.91.to_big_d.floor.should eq(-3) } + + it { "-123.000".to_big_d.floor.value.should eq(-123) } + it { "-1.1".to_big_d.floor.value.should eq(-2) } end describe "#trunc" do diff --git a/src/big/big_decimal.cr b/src/big/big_decimal.cr index 611d5e87c568..be67bb744938 100644 --- a/src/big/big_decimal.cr +++ b/src/big/big_decimal.cr @@ -260,7 +260,8 @@ struct BigDecimal < Number in_scale(new_scale.scale) end - private def in_scale(new_scale : UInt64) : BigDecimal + # :nodoc: + def in_scale(new_scale : UInt64) : BigDecimal if @value == 0 BigDecimal.new(0.to_big_i, new_scale) elsif @scale > new_scale @@ -291,7 +292,8 @@ struct BigDecimal < Number def ceil : BigDecimal mask = power_ten_to(@scale) diff = (mask - @value % mask) % mask - (self + BigDecimal.new(diff, @scale)) + value = self + BigDecimal.new(diff, @scale) + value.in_scale(0) end def floor : BigDecimal @@ -331,11 +333,7 @@ struct BigDecimal < Number # Converts to `BigInt`. Truncates anything on the right side of the decimal point. def to_big_i - if self >= 0 - self.floor.value - else - self.ceil.value - end + trunc.value end # Converts to `BigFloat`.