3

这个小代码简介

    Dim s As Single = 1.15
    Dim d As Double = CDbl(s)
    Console.WriteLine(s)
    Console.WriteLine(d)

产量:

1.15
1.14999997615814

这是完全出乎意料的。为什么会发生这种情况,我该如何解决?

预计到达时间:

这不是我的代码,事实证明原始输入是以字符串“1.15”的形式出现的,所以他们将其转换为单,然后是双。去掉单个部分让每个人都很高兴。

4

2 回答 2

1

在计算机科学的语言中,精度是根据尾数和指数的大小给出的。它与“重要数字”无关。也许最令人困惑的是您正在查看以10为底的以 2为底的浮点数!

如果您查看这两个值的以 2 为底的表示,您会发现它们相距不远。

十进制 1.15 的二进制值为 1.00100110011001... ad infinitum。你得到 23 位尾数Single和 52 位尾数Double。显然,在有限的精度下,尾数中的重复将在不同的地方被切断。

如果您希望数字以相同的以 10 为基数的表示形式显示,您将不得不忍受一些草率,除非您通知字符串转换例程以更好的方式对其进行格式化。

于 2013-05-23T15:25:44.887 回答
1

尽管sd包含完全相同的数值,但为它们显示不同的数字,因为用于SingleDouble转换为文本的位数不同。

Console.WriteLine(s)调用Console.WriteLine(Single)which 生成susing Single.ToStringwhich 使用格式说明符“G”进行转换的文本表示,此处记录。同样,Console.Writeline(d)调用Double.ToString.

根据文档,使用的最大位数是 7Single和 15 Double。我没有看到指定实际使用的位数的文档,只是最大值。

该语句Dim s As Single = 1.15设置s为值 1.14999997615814208984375,因为这是Single最接近 1.15 的值。(第二个最接近的是 1.150000095367431640625。)当您将该值四舍五入到七位十进制数字时,结果是“1.150000”。我认为 .NET 会省略尾随零,产生“1.15”。

d设置为相同的值并打印时,使用 15 位。当 1.14999997615814208984375 舍入为 15 位时,结果为“1.14999997615814”。

Single因此,将 a转换为时没有错误Double。这只是一种展示的错觉。

请注意,Double转换为时通常会出现错误Single。如果你写了Dim d As Double = 1.15,那么d将被设置为 1.149999999999999911182158029987476766109466552734375,我预计Console.WriteLine(d)会产生“1.15”。转换dSingle将产生 1.14999997615814208984375。

于 2013-05-23T16:27:54.407 回答