gpt4 book ai didi

Java BigDecimal ,相当于 C# 的 Decimal(int[] bits) 构造函数

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:21:54 24 4
gpt4 key购买 nike

我正在尝试将包含使用 C# 应用程序生成的数据的输入缓冲区(字节数组)转换为 Java 数据类型。我对 C# 的 Decimal 数据类型有一些疑问。

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 执行按位与清除顶部 32 位并设置底部 32 位,我们构建的数值与在 C# 中将每个 int 转换为 uint 所获得的数值相同。

关于Java BigDecimal ,相当于 C# 的 Decimal(int[] bits) 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43372960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com