每个人都试图运行此代码,
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的问题吗?
答案 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位的小错误根本不重要,因为你使用的数字不是圆的(或者说(无论如何)。