C#中的余数运算符的执行与Visual Basic中的MOD不同

本文关键字:Basic 中的 MOD Visual 不同 执行 余数 运算符 | 更新日期: 2023-09-27 18:24:11

我发现了一种奇怪的情况,将一段代码从C#转换为VB.NET,该代码是一个从基数10转换为基数36的小类,反之亦然。

关键是这个功能:

    /// <summary>
    /// A Base36 De- and Encoder
    /// </summary>
    public static class Base36
    {
        private const string CharList = "0123456789abcdefghijklmnopqrstuvwxyz";
        /// <summary>
        /// Encode the given number into a Base36 string
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static String Encode(long input)
        {
            if (input < 0) throw new ArgumentOutOfRangeException("input", input, "input cannot be negative");
            char[] clistarr = CharList.ToCharArray();
            var result = new Stack<char>();
            while (input != 0)
            {
                result.Push(clistarr[input % 36]);
                input /= 36;
            }
            return new string(result.ToArray());
        }

在VB.NET中转换的应导致:

Public NotInheritable Class Base36
    Private Sub New()
    End Sub
    Private Const CharList As String = "0123456789abcdefghijklmnopqrstuvwxyz"
    ''' <summary>
    ''' Encode the given number into a Base36 string
    ''' </summary>
    ''' <param name="input"></param>
    ''' <returns></returns>
    Public Shared Function Encode(input As Int64) As String
        If input < 0 Then
            Throw New ArgumentOutOfRangeException("input", input, "input cannot be negative")
        End If
        Dim clistarr As Char() = CharList.ToCharArray()
        Dim result = New Stack(Of Char)()
        While input <> 0
            result.Push(clistarr(input Mod 36))
            input /= 36
        End While
        Return New String(result.ToArray())
    End Function

问题是VB.NET中的模运算符与C#中的%余数运算符的执行方式不同,事实上,如果您在C#中调用encode方法:

        long l = 13072113072399; 
        string result = Base36.Encode(l);   //Result is : 4mt8um0b3

在C#中调用方法时:

    Dim l As Int64 = 13072113072399
    Dim result As String = Base36.Encode(l) //Result is : 5nujsu3ar

造成差异的原因是模运算符在某些情况下返回的不同结果,为什么?

VB.NET中%余数运算符的等效项是什么?

C#中的余数运算符的执行与Visual Basic中的MOD不同

Mod运算符:

clistarr(input Mod 36)

但实际问题是

input /= 36

在C#中,当在两个int上使用时,/是整数除法。在VB.NET中,/Integer上的Double,它使用银行家取整。将其更改为整数除法:

input '= 36

或者正确使用DivMod

input = Math.DivRem(input, 36, remainder)