(int)(33.46639 * 1000000) 回报 33466389

为什么会出现这种情况?

有帮助吗?

解决方案

浮点数学并不完美。 每个程序员都应该知道的事 关于它。

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

...

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

其他提示

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

编辑:如理查德说,它的浮点数据,(存储在二进制中的有限组的比特),所以它不完全是)......

这是除夕,在英特尔公司的首席执行官1994年安迪·格鲁夫,年底,在度过了一个伟大的赛季,有什么用奔腾处理器出来并且是一个很大的打击。于是,他走进一间酒吧和有序的尊尼获加绿色标签的双重拍摄。

酒保提供它,并说, “将是$ 20,先生。”

林放二十元的钞票放在柜台上,看着它一会儿,说:“不用找了。”

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

原因在于,33.46639将被表示为一些比该数量稍少。

乘以百万会给你33466389.99999999。

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

如果你想要的“正确”的数量,类型转换之前尝试圆()。

如果你问为什么它不会成为33466390,这是因为doubles没有无限精度,而且数量不能准确地用二进制来表示。

如果您更换一个doubledecimal),它等于(int)(33.46639m * 1000000),所述33466390因为decimals在基座10来计算。

由于33.46639不能被精确在有限数量的二进制数位来表示。的33.46639 * 1000000实际结果是33466389.9999999962747097015380859375。铸造它截断至33466389。

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

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

将结果转换为“int”类型...当相乘时将整数类型向上或向下舍入,然后转换为“int”......不要依赖浮点来足够准确......Skeet 在他的网站上发布了精彩的介绍 这里这里...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top