为什么 (int)(33.46639 * 1000000) 返回 33466389?
-
19-09-2019 - |
题
(int)(33.46639 * 1000000)
回报 33466389
为什么会出现这种情况?
解决方案
浮点数学并不完美。 每个程序员都应该知道的事 关于它。
浮点运算被许多人认为是深奥的学科。这是相当令人惊讶的,因为浮点在计算机系统中无处不在。几乎每种语言都有浮点数据类型;从个人电脑到超级计算机的计算机都具有浮点加速器;大多数编译器有时会被要求编译浮点算法;事实上,每个操作系统都必须响应浮点异常,例如溢出。本文介绍了对计算机系统设计者有直接影响的浮点方面的教程。它首先介绍浮点表示和舍入误差的背景,然后讨论 IEEE 浮点标准,最后以大量示例说明计算机构建者如何更好地支持浮点。
...
将无限多个实数压缩为有限数量的位数需要近似表示。虽然整数有无限多个,但在大多数程序中,整数计算的结果可以存储在 32 位中。相反,给定任何固定的位数,大多数实数计算将产生无法使用这么多位数精确表示的数量。因此,浮点计算的结果通常必须进行舍入,以适应其有限表示。这种舍入误差是浮点计算的特征。
其他提示
双精度不准确,因此在内部33.46639实际存储为33.466389
编辑:如理查德说,它的浮点数据,(存储在二进制中的有限组的比特),所以它不完全是)......
这是除夕,在英特尔公司的首席执行官1994年安迪·格鲁夫,年底,在度过了一个伟大的赛季,有什么用奔腾处理器出来并且是一个很大的打击。于是,他走进一间酒吧和有序的尊尼获加绿色标签的双重拍摄。
酒保提供它,并说, “将是$ 20,先生。”
林放二十元的钞票放在柜台上,看着它一会儿,说:“不用找了。”
原因在于,33.46639将被表示为一些比该数量稍少。
乘以百万会给你33466389.99999999。
的类型转换使用(INT)然后将只返回的整数部分(33466389)。
如果你想要的“正确”的数量,类型转换之前尝试圆()。
如果你问为什么它不会成为33466390
,这是因为double
s没有无限精度,而且数量不能准确地用二进制来表示。
如果您更换一个double
(decimal
),它等于(int)(33.46639m * 1000000)
,所述33466390
因为decimal
s在基座10来计算。
由于33.46639不能被精确在有限数量的二进制数位来表示。的33.46639 * 1000000实际结果是33466389.9999999962747097015380859375。铸造它截断至33466389。