在 VB 中将十进制转换为长整数

converting decimal to long in VB

所以当我尝试 运行 这段代码时,为什么我打印了 2。是每个 Decimal 都转换为 long 然后求和(1 + 1 即 2),还是先对整个 Decimal 求和然后四舍五入(2.5 应该是 3)。奇怪的是,当我将 x 的值更改为 1.26 时,打印的值是 3。2.51 当然应该四舍五入到 3,但是按照这个逻辑,2.5 不应该也四舍五入吗?

Module VBModule

Sub Main()
    Dim x As Decimal = 1.25
    Dim y As Decimal = 1.25
    Dim z As Long = (x+y)
    Console.WriteLine(z)
End Sub

End Module

谢谢!

您假设以 0.5 结尾的分数将向上舍入是不正确的。它们四舍五入到最接近的 even 整数(因此 2.5 舍入为 2,但 3.5 舍入为 4)。这被称为 Bankers Rounding. You can force 0.5 to be rounded up by using the MidpointRounding option with Math.Round。请注意,在 Decimal 上使用 Math.Round 类型 returns a Decimal,因此您仍然需要将其转换为 Long.

以下代码将使用 Option Strict On 进行编译,并将在控制台上显示“3”。

Dim x As Decimal = 1.25D
Dim y As Decimal = 1.25D
Dim z As Long = CLng(Math.Round(x + y, 0, MidpointRounding.AwayFromZero))
Console.WriteLine(z)

运行 下面作为测试。 z 出来的是 3,J 出来的是 2。所以 Dim z As Long = CLng(x + y) 好像是把两者加在一起再转换。而如果你单独转换它们并添加它们,你会得到不同的结果

Option Strict On
Module Module1

Sub Main()
    Dim x As Decimal = CDec(1.26)
    Dim y As Decimal = CDec(1.25)
    Dim z As Long = CLng(x + y)

    Dim F As Long = CLng(x)
    Dim G As Long = CLng(y)
    Dim J As Long = F + G
    Console.WriteLine(z)
    Console.WriteLine(J)

    Console.ReadLine()

End Sub

End Module