VB.NET没有正确地舍入数字?

时间:2014-08-26 14:27:48

标签: vb.net rounding-error

我正在测试一些函数的速度,所以我做了一遍又一遍地运行函数的测试,并将结果存储在一个数组中。我需要按随机生成的数组大小对它们进行排序。我生成了100个元素。合并到救援!我使用了this link to get me started

我关注的代码部分:

private void mergesort(int low, int high) {
// check if low is smaller then high, if not then the array is sorted
    if (low < high) {
      // Get the index of the element which is in the middle
      int middle = low + (high - low) / 2;
      // Sort the left side of the array
      mergesort(low, middle);
     // Sort the right side of the array
      mergesort(middle + 1, high);
     // Combine them both
      merge(low, middle, high);
   }
}
转换为VB.NET的

    private sub mergesort(low as integer, high as integer)
    ' check if low is smaller then high, if not then the array is sorted
        if (low < high)
      ' Get the index of the element which is in the middle
          dim middle as integer = low + (high - low) / 2
      ' Sort the left side of the array
          mergesort(low, middle)
      ' Sort the right side of the array
          mergesort(middle + 1, high)
      ' Combine them both
          merge(low, middle, high)
    end if
end sub

更重要的是,只关注这个问题的LOC是

dim middle as integer = low + (high - low) / 2

如果你想看看合并排序将如何运行这个宝贝

high   low                     high   low
100     0                      10      0
50      0                       6      4
25      0                       5      4
12      0                      12      7
6       0                      10      7
3       0                       8      7
2       0                  :stackoverflow error:

错误来自事实7 +(8 - 7)/ 2 = 8.你会看到7和8传入mergesort(低,中)然后我们无限循环。现在早些时候你会再次看到这样的比较。在5和4. 4 +(5 - 4)/ 2 = 4.因此基本上对于5和4它变为4 +(1)/ 2 = 4.5 = 4.对于8和7虽然它是7 +(1)/ 2 = 7.5 = 8.记住数字被类型化为int。

也许我只是使用了一个不好的实现,或者我的类型转换是错误的,但我的问题是:这不应该是一个红旗,表明发生了舍入的事情是不正确的吗?

2 个答案:

答案 0 :(得分:3)

如果不了解整个算法,请注意VB.NET /与C#/不同。后者默认为整数除法,如果你想在VB.NET中截断小数位,你必须使用\

阅读:\ Operator

所以我认为这就是你想要的:

Dim middle as Int32 = low + (high - low) \ 2

答案 1 :(得分:0)

你的诊断是正确的:有些东西与正在发生的舍入不一致,但如果你知道在哪里看,这是完全可以预期的。

来自VB.NET documentation on the / operator

  

除以两个数字并返回浮点结果。

此文档明确指出,如果xy是整数类型,x / y会返回Double。因此,VB.NET中的5 / 2应该是2.5

来自C# documentation on the / operator

  

所有数字类型都有预定义的除法运算符。

在页面的下方:

  

当你除以两个整数时,结果总是一个整数。

对于C#,如果xy是整数,x / y将返回一个整数(向下舍入)。 C#中的5 / 2预计会返回2