Vyacheslav, I see the problem now. Yes, negative scale is not supported in .NET.
I don't think we should do the multiplication. As you described, this will break equality on Java side. SQL queries might be broken, etc. I think we should throw an exception in .NET when encountering negative decimal scale. Vladimir O, any thoughts? Pavel On Fri, Feb 3, 2017 at 12:01 PM, Vyacheslav Daradur <daradu...@gmail.com> wrote: > Hello. > > I looked and understood the code of methods ReadDecimal and WriteDecimal > on .NET platform. > > 1. At the moment remaking of this methods for my Java-decimal-fix is very > difficult, it needs to write new methods for serialization/deserialization > of negative decimals. > > I can make it, but there is simpler decision: to add additional byte for > sign. > > I need advice: difficult solution (new methods .net) Versus : simple > solutions (additional byte)? > > *I don't know yet, what changes are necessary on ะก++ platform. > > 2. I see a problem with the negative scale on .NET platform. > > Now negative scale is forbidden. > > We can make: > if (scale < 0) return Decimal.Multiply(new decimal(lo, mid, hi, neg, 0), > new decimal(Math.Pow(10, -scale))); > > But there is the problem: > * 1 Serialize in Java; number=123456789, scale=-4 > * 2 Deserialize in .NET; number=1234567890000, scale=0 > * 3 Serialize in .NET; number=1234567890000, scale=0 > * 4 Deserialize in Java; number=1234567890000, scale=0 > > Logically: (1) 123456789 * 10^4 == (2) 1234567890000 > > In Java (1) not equal (2), because scales are different. > > Any thougths? > > 2017-01-31 14:08 GMT+03:00 Pavel Tupitsyn <ptupit...@apache.org>: > >> Vyacheslav, >> >> I'm not sure I understand the code you attached. >> >> If you know how to fix the .NET part, can you just do it in your PR and >> run "Platform .NET" on TeamCity to verify? >> http://ci.ignite.apache.org/viewType.html?buildTypeId=Ignite >> Tests_IgnitePlatformNet >> >> Thanks, >> >> Pavel >> >> On Tue, Jan 31, 2017 at 1:35 PM, Vyacheslav Daradur <daradu...@gmail.com> >> wrote: >> >>> Pavel, I see that you are the main contributor of Ignite.NET. >>> >>> We should repair BinaryUtils#ReadDecimal and BinaryUtils#WriteDecimal. >>> >>> *ReadDecimal: >>> byte[] mag = ReadByteArray(stream); // including at least one sign bit, >>> which is (ceil((this.bitLength() + 1)/8)) >>> bool neg = (mag[0] < 0); >>> if (scale < 0) >>> // TODO: a scale of -3 means the unscaled value is multiplied by 1000 >>> >>> *WriteDecimal: >>> int sign = vals[3] < 0 ? -1 : 0; >>> stream.WriteInt(sign); >>> >>> Can you help with this task? >>> >>> >>> 2017-01-31 12:46 GMT+03:00 Igor Sapego <isap...@gridgain.com>: >>> >>>> Vyacheslav, >>>> >>>> I had a look at your PR and left some comments in Jira. >>>> >>>> Best Regards, >>>> Igor >>>> >>>> On Mon, Jan 30, 2017 at 12:52 PM, Vyacheslav Daradur < >>>> daradu...@gmail.com> >>>> wrote: >>>> >>>> > Hello. I fixed it. Please, review. >>>> > >>>> > https://issues.apache.org/jira/browse/IGNITE-3196 - Marshaling works >>>> wrong >>>> > for the BigDecimals that have negative scale >>>> > >>>> >>> >>> >> >