【问题标题】:CInt does not round Double value consistently - how can I remove the fractional part?CInt 不会一致地舍入 Double 值 - 如何删除小数部分?
【发布时间】:2011-12-02 19:21:45
【问题描述】:

我偶然发现了 CInt 的问题,并将双精度数转换为整数。

问题如下:

CInt(10.5)  'Result is 10
CInt(10.51) 'Result it 11, but I expected 10...

我习惯了 (int) 10.51 为 10 的 C# 样式转换。

正如关于Integer.Parse vs CInt 的问题中所指出的,结果只是以某种方式四舍五入。

但是,我只需要获取整数部分并丢弃小数部分。如何在 VB.NET 中实现这种类型的转换?经过一番研究,我发现我可以使用 Fix() 函数来解决问题,但它是最佳选择吗?

【问题讨论】:

  • 更糟糕的是:cint(10.5) = 10 但 cint(11.5) = 12。如果整数部分是偶数,则 0.50000000 向下舍入,奇数则向上!

标签: .net vb.net c#-to-vb.net rounding


【解决方案1】:

您可以使用IntFix 函数,但这些函数的返回值类型是双精度,因此如果option stricton,则必须将其转换为整数。

  no = Convert.ToInt32(Int(10.51))

【讨论】:

  • 我比第一个更喜欢这种方式。非常感谢,AVD!
  • 结合这两个答案,我认为CInt(Int(10.51)) 应该可以工作;)
【解决方案2】:

首先,您认为CInt 等同于C# 中的(int) 的假设是不正确的。

其次,CInt 的舍入行为不是随机分配的——它实际上使用“银行家舍入”:

小数部分。当您将非整数值转换为整数时 类型,整数转换函数(CByte,CInt,CLng,CSByte, CShort、CUInt、CULng 和 CUShort)删除小数部分并 将值四舍五入到最接近的整数。

如果小数部分正好是0.5,则进行整数转换 函数将其四舍五入到最接近的偶数。例如,0.5 舍入为 0,而 1.5 和 2.5 均舍入为 2。这有时称为 银行家的四舍五入,其目的是补偿一个偏差 将许多这样的数字加在一起时可能会累积。

在 C# 中使用 (int) 的最佳等价物是 VisualBasic 命名空间中的 Fix 函数,该函数向零舍入(与 Math.Truncate 相同)。

然而,这会返回一个 Double 值,因此您必须使用 CInt 进行进一步转换才能获得您的整数。

CInt(Fix(10.5)) '10
CInt(Fix(10.51)) '10
CInt(Fix(11.5)) '11
CInt(Fix(-10.5)) '-10
CInt(Fix(-10.51)) '-10
CInt(Fix(-11.5)) '-11

【讨论】:

    【解决方案3】:

    我觉得你可以试试CInt(Math.Floor(10.51)) 希望这会有所帮助

    【讨论】:

    • 请注意,对于负数,这可能不会给出预期的结果:Math.Floor(-10.51)-11。如果你想要-10,你可以使用Math.Truncate
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多