转换的BigDecimal的Java与C#的十进制(conversion BigDecimal Ja

2019-10-16 13:39发布

在Java BigDecimal类包含的值作为A * POW(10,B)其中A是2的补码,其非锁定位长度,而B是32位整数。

在C#十进制包含值POW(-1,S)×C×POW(10,-e),其中的符号s是0或1时,系数c由0≤ç<POW(2,96),和给定的规模e是使得0≤Ë≤28。

我想对Java的BigDecimal转换为像JAVA C#十进制的东西。 你能帮助我吗 。

我有一些像这样的事情

class CS_likeDecimal
{

    private int hi;// for 32bit most sinificant bit of c 
    private int mid;// for 32bit in the middle  
    private int lo;// for 32 bit the last sinificant bit

    .....
    public CS_likeDecimal(BigDecimal data)
    {
                ....

    }

}

其实我发现这有什么表示System.Decimal在Protocol Buffers的最好方法是什么? 。

它用于发送C#十进制的协议缓冲,但在protobuff网项目使用该发送的消息c#之间(但我想C#和Java之间)

message Decimal {
  optional uint64 lo = 1; // the first 64 bits of the underlying value
  optional uint32 hi = 2; // the last 32 bis of the underlying value
  optional sint32 signScale = 3; // the number of decimal digits, and the sign

}

谢谢,

Answer 1:

Decimal我在protobuf网使用主要是为了支持在管,它支持一个固定的范围的两端使用protobuf网的存在的可能的使用。 这听起来像两种讨论的范围是不一样的,所以:不兼容强劲。

我会明确地使用的另一种表示建议。 我不知道有什么表示是可用于Java的BigDecimal -是否有务实byte[]的版本,或string版本。

如果你有信心,规模和范围将不会是一个问题,那么它应该是可能的两个布局一些位摆弄之间捏造。



Answer 2:

我需要一个BigDecimal写入/从净十进制转换器。 使用此引用: http://msdn.microsoft.com/en-us/library/system.decimal.getbits.aspx我写了这个代码,可以工作:

public static byte[] BigDecimalToNetDecimal(BigDecimal paramBigDecimal) throws IllegalArgumentException
{
    // .Net Decimal target
    byte[] result = new byte[16];

    // Unscaled absolute value
    BigInteger unscaledInt = paramBigDecimal.abs().unscaledValue();
    int bitLength = unscaledInt.bitLength();
    if (bitLength > 96)
        throw new IllegalArgumentException("BigDecimal too big for .Net Decimal");

    // Byte array
    byte[] unscaledBytes = unscaledInt.toByteArray();
    int unscaledFirst = 0;
    if (unscaledBytes[0] == 0)
        unscaledFirst = 1;

    // Scale
    int scale = paramBigDecimal.scale();
    if (scale > 28)
        throw new IllegalArgumentException("BigDecimal scale exceeds .Net Decimal limit of 28");
    result[1] = (byte)scale;

    // Copy unscaled value to bytes 8-15 
    for (int pSource = unscaledBytes.length - 1, pTarget = 15; (pSource >= unscaledFirst) && (pTarget >= 4); pSource--, pTarget--)
    {
        result[pTarget] = unscaledBytes[pSource];
    }

    // Signum at byte 0
    if (paramBigDecimal.signum() < 0)
        result[0] = -128;

    return result;
}

public static BigDecimal NetDecimalToBigDecimal(byte[] paramNetDecimal)
{
    int scale = paramNetDecimal[1];
    int signum = paramNetDecimal[0] >= 0 ? 1 : -1;
    byte[] magnitude = new byte[12];
    for (int ptr = 0; ptr < 12; ptr++) magnitude[ptr] = paramNetDecimal[ptr + 4];
    BigInteger unscaledInt = new BigInteger(signum, magnitude);

    return new BigDecimal(unscaledInt, scale);
}


文章来源: conversion BigDecimal Java to c#-like Decimal