执行简单计算时有一个错误

时间:2014-12-11 11:04:24

标签: visual-studio

每个人都试图运行此代码,

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        MsgBox(968 * 0.05 - 55)
    End Sub
End Class

结果是:-6.5999999999999 为什么不是-6.6? 这是VS的问题吗?

2 个答案:

答案 0 :(得分:1)

这不是错误:它是浮点类型的正常行为。

您得到的是您期望值的更接近的近似值。 浮点值使用位(与任何其他值类型一样)存储,但并非所有数字都可以按位完全表示。

如果你愿意向用户显示任何浮点值(就像通过MsgBox一样),那么你应该格式化它,就像(作为一个非常简单的例子):

MsgBox((968 * 0.05 - 55).ToString("F2"))

只保留前2个十进制数字(如果需要)并将内部(二进制)值近似为该文本表示。

的问候,
丹尼尔。

答案 1 :(得分:1)

Visual Studio中没有问题。这是因为计算算法。

http://floating-point-gui.de/basic/

因为在内部,计算机使用的格式(二进制浮点)无法准确表示0.1,0.2或0.3之类的数字。

编译或解释代码时,“0.1”已经四舍五入到该格式的最接近数字,这导致计算发生前的小舍入误差。 为什么计算机使用这样一个愚蠢的系统?

这不是愚蠢的,只是不同的。十进制数字不能准确地表示像1/3这样的数字,所以你必须舍入到0.33之类的东西 - 而且你不要指望0.33 + 0.33 + 0.33加起来为1,你呢?

计算机使用二进制数,因为它们在处理这些数字时速度更快,并且因为对于大多数计算,小数点后17位的小错误根本不重要,因为你使用的数字不是圆的(或者说(无论如何)。