C# 双精度(double)浮点数 与 64位整数之间相互转换的多种代码示例
时间: 2025-07-14 07:40:51 浏览: 3
<think>好的,我现在需要解决用户关于C#中双精度浮点数与Int64之间相互转换的问题。首先,我得回忆一下C#的基本类型转换方法。用户提到了double和Int64,也就是long类型,因为Int64是System.Int64的别名,对应long。
首先,用户可能需要知道如何将double转换为Int64。根据之前的引用,比如引用[1]中有一个例子,将double转换为int,使用显式转换:(int)x。不过这里转换到Int64,也就是long,同样的方法应该适用。比如,double d = 1234.56; long l = (long)d; 这样会截断小数部分,得到1234。但用户可能需要注意精度丢失的问题,比如当double的值超出Int64的范围时,转换会怎样处理?可能需要使用checked关键字来捕获溢出异常。
接下来,用户可能还需要将Int64转换回double。这部分应该比较简单,因为从long到double是隐式转换,不需要显式转换,但为了代码清晰,可能还是可以加上显式转换。例如,long l = 123456789; double d = (double)l; 或者直接d = l; 因为long可以安全地转换为double,不过可能会有精度问题,如果数值非常大,超过double的精度范围的话,可能会有精度丢失,但Int64的范围在-9e18到9e18之间,而double的有效精度大约是15-17位,所以对于非常大的Int64数值,转换为double可能会有精度损失,这一点需要提醒用户注意。
另外,用户可能需要了解其他转换方法,比如使用BitConverter。这种方法不是直接转换数值,而是按位转换,将double的二进制表示转换为Int64。例如,使用BitConverter.DoubleToInt64Bits方法,可以将double的位模式直接复制到long中,这在需要处理二进制数据或者进行某些低级操作时很有用。例如,double d = 1.5; long l = BitConverter.DoubleToInt64Bits(d); 这样得到的l是二进制表示的整数。同样,反向转换使用BitConverter.Int64BitsToDouble方法。
然后,我需要参考用户提供的引用内容。引用[1]展示了将double转换为int的显式转换,引用[2]提到了使用Convert类的方法,比如Convert.ToInt64,这可能也是一个选项。Convert.ToInt64在转换时会进行四舍五入吗?还是截断?需要确认。根据C#文档,Convert.ToInt64(double)会进行四舍五入,而显式转换(long)则会截断小数部分。例如,Convert.ToInt64(123.7)得到124,而(long)123.7得到123。所以用户如果需要四舍五入,应该使用Convert类的方法。
此外,引用[4]提到了与byte数组的转换,这可能与BitConverter相关,但用户的问题是关于Int64的,所以这部分可能暂时不需要,但可以作为扩展知识提及。
接下来,整理代码示例。首先显式转换,然后使用Convert类,再使用BitConverter的方法。需要注意每种方法的区别和适用场景。例如,显式转换快速但截断,Convert方法四舍五入,BitConverter用于位模式转换。
用户还可能关心转换时的异常处理,比如溢出。当double的值超过Int64.MaxValue或小于Int64.MinValue时,显式转换会引发溢出异常吗?在默认情况下,显式转换会直接将结果截断为Int64的最大或最小值,而不会抛出异常,除非在checked上下文中。例如,如果double的值是1e20,转换为long会得到9223372036854775807,即Int64.MaxValue,这可能不是用户期望的结果,所以需要提醒用户检查数值范围,或者在需要时使用checked来抛出异常。
最后,总结这些方法,并指出适用场景,比如是否需要保留小数部分,是否需要处理溢出,或者是否需要二进制位模式转换。同时,提醒用户注意精度问题,尤其是在大数值转换时可能丢失精度。</think>### C#中double与Int64相互转换的实现方法
在C#中,双精度浮点数(`double`)与64位整数(`Int64`/`long`)的相互转换可以通过以下方法实现:
---
#### **1. 显式类型转换**
适用于需要直接截断小数部分的场景。
```csharp
// double转Int64(截断小数部分)
double d1 = 1234.56;
long l1 = (long)d1; // 结果为1234
// Int64转double(隐式转换,无需显式声明)
long l2 = 987654321;
double d2 = l2; // 结果为987654321.0
```
- **注意**:若`double`值超出`Int64`范围($-9.2 \times 10^{18}$ 至 $9.2 \times 10^{18}$),转换会溢出,默认不抛异常[^1]。
---
#### **2. 使用`Convert`类**
适用于需要四舍五入或处理格式化的场景。
```csharp
// double转Int64(四舍五入)
double d3 = 123.7;
long l3 = Convert.ToInt64(d3); // 结果为124
// Int64转double
long l4 = -123456789;
double d4 = Convert.ToDouble(l4); // 结果为-123456789.0
```
- **注意**:`Convert`类会对小数部分四舍五入,而非直接截断[^2]。
---
#### **3. 按位转换(`BitConverter`)**
适用于需要保留二进制位模式的场景。
```csharp
// double转Int64(按二进制位转换)
double d5 = 1.5;
long l5 = BitConverter.DoubleToInt64Bits(d5); // 结果为4609434218613702656
// Int64转double(反向操作)
long l6 = 4609434218613702656;
double d6 = BitConverter.Int64BitsToDouble(l6); // 结果为1.5
```
- **注意**:此方法直接操作二进制表示,不涉及数值本身的转换[^4]。
---
### **关键注意事项**
1. **精度问题**:`double`的有效精度约为15-17位,极大/极小的`Int64`值转换为`double`时可能丢失精度。
2. **溢出处理**:若需在溢出时抛异常,使用`checked`关键字:
```csharp
checked {
long l7 = (long)1e20; // 抛出OverflowException
}
```
3. **性能对比**:显式转换最快,`Convert`类次之,`BitConverter`适用于特殊需求。
---
阅读全文
相关推荐


















