我试图将包含使用C#应用程序生成的数据的输入缓冲区(字节数组)转换为java数据类型.我对C#的Decimal dataType有一些问题.
C#示例:
decimal decimalValue = 20.20M;
//converting a Decimal value to 4 integer vlaues
int[] intPieces= Decimal.GetBits(decimalValue); //{2020,0,0,131072}
//using native constructor to rebuild value
Decimal newDecimalValue = new decimal(intPieces); //20.20
Console.WriteLine("DecimalValue is " + newDecimalValue);
但是java中没有Decimal(也没有Decimal(int [] bits)构造函数).
C#Decimal Constructor (Int32[])文件.
解决方法:
在Java中,您将使用BigDecimal.这种类型并不完全相同,但它相当接近.
您只需要将96位整数重建为BigInteger,然后对其进行缩放并选择否定它:
import java.math.BigDecimal;
import java.math.BigInteger;
public class Test {
public static void main(String[] args) {
int[] parts = { 2020, 0, 0, 131072 };
BigInteger integer = BigInteger.valueOf(parts[2] & 0xffffffffL).shiftLeft(32)
.add(BigInteger.valueOf(parts[1] & 0xffffffffL )).shiftLeft(32)
.add(BigInteger.valueOf(parts[0] & 0xffffffffL));
BigDecimal decimal = new BigDecimal(integer, (parts[3] & 0xff0000) >> 16);
if (parts[3] < 0) // Bit 31 set
{
decimal = decimal.negate();
}
System.out.println(decimal);
}
}
输出:
20.20
构造BigInteger部件时的屏蔽是有效地将值视为无符号 – 执行带有long的按位AND,前32位清零且底部32位设置,我们构造相同的数值,你得到通过在C#中将每个int转换为uint.
标签:java,type-conversion 来源: https://codeday.me/bug/20190823/1700671.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。