diff --git a/src/neo/BigDecimal.cs b/src/neo/BigDecimal.cs index aaf541caa9..ad1948f6bc 100644 --- a/src/neo/BigDecimal.cs +++ b/src/neo/BigDecimal.cs @@ -18,6 +18,12 @@ public BigDecimal(BigInteger value, byte decimals) this.decimals = decimals; } + public BigDecimal(decimal value) + { + this.decimals = BitConverter.GetBytes(decimal.GetBits(value)[3])[2]; + this.value = new BigInteger(decimal.Multiply((Decimal)Math.Pow(10, this.decimals), value)); + } + public BigDecimal ChangeDecimals(byte decimals) { if (this.decimals == decimals) return this; diff --git a/tests/neo.UnitTests/UT_BigDecimal.cs b/tests/neo.UnitTests/UT_BigDecimal.cs index cdde9f9e89..ccd147427a 100644 --- a/tests/neo.UnitTests/UT_BigDecimal.cs +++ b/tests/neo.UnitTests/UT_BigDecimal.cs @@ -30,12 +30,34 @@ public void TestBigDecimalConstructor() BigDecimal value = new BigDecimal(new BigInteger(45600), 7); value.Value.Should().Be(new BigInteger(45600)); value.Decimals.Should().Be(7); + value = new BigDecimal(new BigInteger(0), 5); value.Value.Should().Be(new BigInteger(0)); value.Decimals.Should().Be(5); + value = new BigDecimal(new BigInteger(-10), 0); value.Value.Should().Be(new BigInteger(-10)); value.Decimals.Should().Be(0); + + value = new BigDecimal(123.456789M); + value.Value.Should().Be(new BigInteger(123456789)); + value.Decimals.Should().Be(6); + + value = new BigDecimal(-123.45M); + value.Value.Should().Be(new BigInteger(-12345)); + value.Decimals.Should().Be(2); + + value = new BigDecimal(123.45M); + value.Value.Should().Be(new BigInteger(12345)); + value.Decimals.Should().Be(2); + + value = new BigDecimal(123M); + value.Value.Should().Be(new BigInteger(123)); + value.Decimals.Should().Be(0); + + value = new BigDecimal(0M); + value.Value.Should().Be(new BigInteger(0)); + value.Decimals.Should().Be(0); } [TestMethod]