关于CDbl的加减法问题

Heaven_Feel 2018-05-28 04:23:40
最近遇到一个问题
Dim a1 As Double = (CDbl("1.1")) - (CDbl("0.1"))
Dim b1 As Double = (CDbl("1.1")) + (CDbl("0.1"))

a1是1.0,b1是1.2000000000000002
最后在外面再套了一个Math.Round解决了问题,但是还是想不明白b1是怎么出来的,有没有人能解释一下
...全文
384 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Heaven_Feel 2018-05-29
  • 打赏
  • 举报
回复
引用 1 楼 chewinggum 的回复:
浮点运算有精度问题 对于二进制小数,小数点右边能表达的值是 1/2, 1/4, 1/8, 1/16, 1/32, 1/64, 1/128 … 1/(2^n)。所有这些小数都是一点一点的拼凑出来的一个近似的数值, 所有才会不准确的。 举个例子, 现在用二进制来表示十进制的1.2: 1.01 = 1 + 1/4 = 0.25 , 偏大 1.001 = 1 + 1/8 = 0.125 , 偏小 1.0011 = 1 + 1/8 + 1/16 = 0.1875 , 1.001101 = 1 + 1/8+ 1/16 + 1/64 = 0.203125 , 又偏大 1.0011001 = 1 + 1/8 + 1/16 + 1/128 = 0.1953125 , 1.00110011 = 1 + 1/8+1/16+1/128+1/256 = 0.19921875 , 这个很接近 越来越接近…….. 这就是所谓的用二进制小数没法精确表达10进制小数的意思。 浮点数有的时候拿来做等于的条件判断时要小心, 比如

    Dim a As Double
    Dim b As Double
    a = 3
    b = 3
    b = b / 27
    b = b / 27
    b = b / 27
    b = b * 27
    b = b * 27
    b = b * 27
    Debug.Print a, b, a = b
按道理 一系列运算后 b 还是3,a与b相等。 但是输出却是 3 3 false 如果再一系列运算以后拿两个浮点数进行比较,有时候你debug会非常痛苦,怎么看数据都是对的,但结果就是不对。更讨厌的是,这种问题导致的bug经常是不能百分百重现的。偶然抽风出现一下你一脸懵逼。
谢谢
脆皮大雪糕 2018-05-28
  • 打赏
  • 举报
回复
浮点运算有精度问题 对于二进制小数,小数点右边能表达的值是 1/2, 1/4, 1/8, 1/16, 1/32, 1/64, 1/128 … 1/(2^n)。所有这些小数都是一点一点的拼凑出来的一个近似的数值, 所有才会不准确的。 举个例子, 现在用二进制来表示十进制的1.2: 1.01 = 1 + 1/4 = 0.25 , 偏大 1.001 = 1 + 1/8 = 0.125 , 偏小 1.0011 = 1 + 1/8 + 1/16 = 0.1875 , 1.001101 = 1 + 1/8+ 1/16 + 1/64 = 0.203125 , 又偏大 1.0011001 = 1 + 1/8 + 1/16 + 1/128 = 0.1953125 , 1.00110011 = 1 + 1/8+1/16+1/128+1/256 = 0.19921875 , 这个很接近 越来越接近…….. 这就是所谓的用二进制小数没法精确表达10进制小数的意思。 浮点数有的时候拿来做等于的条件判断时要小心, 比如

    Dim a As Double
    Dim b As Double
    a = 3
    b = 3
    b = b / 27
    b = b / 27
    b = b / 27
    b = b * 27
    b = b * 27
    b = b * 27
    Debug.Print a, b, a = b
按道理 一系列运算后 b 还是3,a与b相等。 但是输出却是 3 3 false 如果再一系列运算以后拿两个浮点数进行比较,有时候你debug会非常痛苦,怎么看数据都是对的,但结果就是不对。更讨厌的是,这种问题导致的bug经常是不能百分百重现的。偶然抽风出现一下你一脸懵逼。

7,759

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧