代码之家  ›  专栏  ›  技术社区  ›  John Farrell

为什么(int)(33.46639*1000000)返回33466389?

  •  18
  • John Farrell  · 技术社区  · 16 年前

    (int)(33.46639 * 1000000) 退货 33466389

    为什么会这样?

    7 回复  |  直到 12 年前
        1
  •  31
  •   Community Mohan Dere    6 年前

    What every programmer should know 关于它。

    浮点运算被许多人认为是一门深奥的学科。这相当令人惊讶,因为浮点运算在计算机系统中无处不在。几乎每种语言都有浮点数据类型;从个人电脑到超级计算机都有浮点加速器;大多数编译器会不时地被要求编译浮点算法;实际上,每个操作系统都必须对诸如溢出之类的浮点异常做出响应。本文提供了一个有关浮点运算的教程,这些方面对计算机系统的设计者有着直接的影响。它从浮点表示和舍入误差的背景开始,接着讨论了IEEE浮点标准,最后给出了计算机建设者如何更好地支持浮点的许多例子。

    将无限多个实数压缩成有限位数需要近似表示。虽然有无限多个整数,但在大多数程序中,整数计算的结果可以存储在32位中。相反,给定任何固定的位数,大多数实数计算将产生无法用那么多位数精确表示的量。因此,浮点计算的结果必须经常四舍五入,以适应其有限表示形式。这种舍入误差是浮点计算的特征。

        2
  •  5
  •   Reverend Gonzo    16 年前

    双精度并不精确,因此内部33.46639实际上存储为33.466389

    编辑:正如Richard所说,它是浮点数据(以二进制形式存储在有限的一组位中),所以不完全是那样。。。。

        3
  •  3
  •   O. Jones    16 年前

    酒保端上来说:“20美元,先生。”

    http://en.wikipedia.org/wiki/Pentium_FDIV_bug

        4
  •  2
  •   Peter K.    16 年前

    原因是33.46639将被表示为略小于该数字的值。

    使用(int)的类型转换将只返回整数部分(33466389)。

    如果您想要“正确”的数字,请在类型转换之前尝试round()。

        5
  •  1
  •   Mark Carpenter    16 年前

    如果你问为什么 33466390 ,因为 double

    双重的 decimal ( (int)(33.46639m * 1000000) ),等于 33466390 十进制的 s以10为基数计算。

        6
  •  1
  •   dan04    16 年前

    因为33.46639不能精确地用有限个二进制数字来表示。33.46639*1000000的实际结果为33466389.999999962747097015380859375。演员阵容将其截至33466389人。

        7
  •  -1
  •   t0mm13b    16 年前

    你得到不同结果的原因是你用了 '

    (int)(33.46639 * 1000000) returns 33466389
    ^^^^^
    

    要将结果强制转换为“int”类型。。。它或者向上取整,或者向下取整,当它们相乘,然后转换成“int”。。。。不要依赖浮点数来达到足够的精度…斯基特在他的网站上发表了一篇精彩的介绍 here here

    推荐文章